有没有办法在Java中编写regular expression
,找出String
是否包含奇数个特定字符,即"a"
?我用它编写了更详细的代码,使用了以下方法:
public static boolean hasEvenNumber(String s) {
int count = 0;
Pattern p = Pattern.compile("(^a)*(a)");
Matcher m = p.matcher(s);
while (m.find())
count++;
if (count % 2 != 0)
return true;
return false;
}
例如,如果将一个字符串"jsadaajaaikadjasl"
作为参数传递,则它返回true,因为它包含7 "a"
。有没有更优雅的方法来实现它只使用regex
并检查它:
Pattern p = Pattern.compile(...);
Matcher m = p.matcher(s);
if(m.matches())
return true;
答案 0 :(得分:4)
只需创建一个与"(?:[^a]*a[^a]*a)*"
偶数相匹配的模式,即添加另一个匹配项(?:[^a]*a[^a]*a)*[^a]*a[^a]
。现在,如果匹配器。matches
返回true
,则会出现奇数次数。
答案 1 :(得分:1)
我只计算字符并检查字符串是否不以相关字符开头。您可以使用Apache Commons CharsetUtils:
public static boolean hasOddNumber(String s, char c) {
boolean hasOddNumber = false;
if (s.charAt(0) != c){
hasOddNumber = CharSetUtils.count(s, c) % 2 != 0;
}
return hasOddNumber;
此外,我将方法名称更改为hasOddNumber
,因为您的问题意味着您想知道字符串是否具有奇数出现次数。
答案 2 :(得分:1)
我不知道你为什么要在这里使用正则表达式(我不确定我是否不知道)但你可以试试[^a]*a([^a]*a[^a]*a)*[^a]*
。
这意味着
[^a]* # zero or more non-a characters
# (in case string starts with non-a character)
a # one "a" character
([^a]*a[^a]*a)* # two "a" characters preceded by zero or more non-a characters
# (this will match any numbers of "..a..a" "pairs")
[^a]* # zero or more non-a characters
# (in case string ends with non-a character)
如果您希望匹配偶数a
,只需从开始或正则表达式中删除[^a]*a
。
System.out.println("jsadaajaaikadjasl".matches("[^a]*a([^a]*a[^a]*a)*+[^a]*"));
System.out.println("jasadaajaaikadjasl".matches("[^a]*a([^a]*a[^a]*a)*+[^a]*"));
输出:
true
false
你可以使用这个简单的方法来代替正则表达式,它会迭代所有的字符串字符,将它们与搜索的字符进行比较,每次找到匹配从boolean
到odd
的匹配翻转even
标记时反之亦然。
public static boolean hasOdd(String s, char character) {
boolean response = false;
for (char c : s.toCharArray())
if (c == character)
response = !response;
return response;
}
//...
System.out.println(hasOdd("jsadaajaaikadjasl", 'a'));//true
System.out.println(hasOdd("jasadaajaaikadjasl", 'a'));//false
答案 3 :(得分:0)
如果你真的需要一个正则表达式,那么这段代码应该可以工作:
String str = "abadaa";
boolean isAOdd = str.matches("^[^a]*a(?=(([^a]*a){2})*[^a]*$).*$"); // false
str = "abadaacad";
isAOdd = str.matches("^[^a]*a(?=(([^a]*a){2})*[^a]*$).*$"); // true
答案 4 :(得分:0)
奇怪:"^[^a]*(a[^a]*a[^a]*)*a[^a]*$"
甚至:"^([^a]*a[^a]*a[^a]*)+$"
答案 5 :(得分:0)
(?:([^a]*a[^a]*a[^a]*)*)
匹配偶数a
和
[^a]*a(?:([^a]*a[^a]*a[^a]*)*)
匹配奇数a
。
答案 6 :(得分:0)
这应该是你想要实现的一个工作范例。
public static boolean hasEvenNumber(String s) {
int counter = 0;
Pattern p = Pattern.compile("([aA])?{1,}");
Matcher m = p.matcher(s);
while (m.find()) {
if (m.group().equalsIgnoreCase("a"))
counter++;
}
return (counter != 0 && counter%2==0);
}
答案 7 :(得分:0)
public static void main(String[] args) {
String s = "jsadaajaaikadjasl";
System.out.println(hasEvenNumber(s,"a"));
}
public static boolean hasEvenNumber(String s, String letter) {
int count = s.length() - s.replaceAll(letter, "").length();
return count % 2 == 0 ? false : true ;
}