[英]Regex for finding between 1 and 3 character in a string
我正在嘗試編寫一個正則表達式,如果在1到3之間出現[A-Za-z],則應返回true,但我無法執行此操作
public static void main(String[] args) {
String regex = "(?:([A-Za-z]*){3}).*";
String regex1 = "(?=((([A-Za-z]){1}){1,3})).*";
Pattern pattern = Pattern.compile(regex);
System.out.println(pattern.matcher("AD1CDD").find());
}
注意:對於連續的3個字符,我可以編寫它,但是我要實現的是,對於整個字符串,出現的次數應該在1到3之間。 如果有4個字符,則應返回false。 我已經使用超前實現
如果我正確理解您的問題,則要檢查
首先,僅對字符進行計數而不使用正則表達式會更有效,因為這不是常規語言問題,而是瑣碎的計數問題。 使用for
循環解決此問題沒有什么錯(除了諸如Python和R之類的解釋器可能相當慢)。
不過,您可以(ab-)使用擴展的正則表達式:
^([^A-Za-z]*[A-Za-z]){1,3}[^A-Za-z]*$
一旦您還對“其他”字符進行建模,這將非常簡單。 這就是您定義模式所要做的:對所有可接受的字符串(即整個“語言”)建模,不僅要建模您要查找的那些字符。
另外,您可以“ findAll”匹配([A-Za-z])
,並查看結果的長度。 如果您還需要實際的字符,這可能會更方便。
for循環如下所示:
public static boolean containsOneToThreeAlphabetic(String str) {
int matched = 0;
for(int i=0; i<str.length; i++) {
char c = str.charAt(i);
if ((c>='A' && c<='Z') || (c>='a' && c<='z')) matched++;
}
return matched >=1 && matched <= 3;
}
這是直接,可讀,可擴展和高效的(在編譯語言中)。 您還可以添加if (matched>=4) return false;
(或break
)以盡早停止。
請停止使用正則表達式,這不僅會使您自己的生活變得復雜,而且會使將來必須處理您的代碼的人們的生活更加復雜。 選擇一種更簡單的方法,找到所有[A-Za-z]+
字符串,將它們放入列表中,然后檢查每個字符串,如果長度在1到3之間或超出該范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.