Java 正则表达式以查找字符串中是否存在特定字符的奇数次
有没有办法在Java中编写一个Java 正则表达式以查找字符串中是否存在特定字符的奇数次,java,regex,string,Java,Regex,String,有没有办法在Java中编写一个正则表达式,以查找字符串是否包含一个特定字符的奇数,即“a”?我使用以下方法编写了更详细的代码: public static boolean hasEvenNumber(String s) { int count = 0; Pattern p = Pattern.compile("(^a)*(a)"); Matcher m = p.matcher(s); while (m.find())
正则表达式
,以查找字符串
是否包含一个特定字符的奇数,即“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;
?只需创建一个匹配偶数计数的模式,如
“(?:[^a]*a[^a]*a)*”
添加另一个引用,(?:[^a]*a[^a]*a)*[^a]*a[^a]
。现在,如果matcher.匹配
返回true
则出现的次数为奇数。我只需对字符进行计数,并检查字符串是否以有问题的字符开头。您可以使用Apache Commons实现以下目的:
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
,因为您的问题意味着您想知道字符串的出现次数是否为奇数。如果您确实需要正则表达式,则此代码应该可以工作:
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
奇数:“^a[^a]*(a[^a]*a[^a]*)*a[^a]*$”
偶数:“^([^a]*a[^a]*a[^a]*)+$”
匹配a的偶数
和
[^a]*a(?:([^a]*a[^a]*a[^a]*)*)
匹配
a的奇数
我不知道您为什么要在这里使用正则表达式(我不知道是否不知道),但您可以尝试使用[^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
,只需从start或regex中删除[^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
您可以使用这个简单的方法来代替正则表达式,该方法将迭代所有字符串,将它们与搜索到的字符串进行比较,每次它找到匹配时,将flip
boolean
标志从奇数
转换为偶数
,反之亦然
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
这里应该有一个你正在努力实现的工作示例
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);
}
你为什么需要正则表达式?一个简单的循环就可以做到这一点。
!s、 replaceAll(“[^*a[^a]a[^a]*.[^a]+”,”).isEmpty()
我知道限制解决方案的方式不是最好的,但正是出于这个原因,我在问。我知道有很多方法可以做到这一点,但我对只使用正则表达式的方式感兴趣。没有理由为此使用正则表达式。我不明白正则表达式的解决方案怎么会比循环解决方案更详细,而且这将更加神秘——在这里使用正则表达式很简单。java代码的操作部分是for(int i=0;iYou需要为正则表达式添加锚来测试整个字符串:),否则,使用。matches
我说了“usematches
”。但是我忘记了重复。修复了。结果将与“aba”相同
和“abaa”
如此正确。模式p=Pattern.compile(([aA])?{1,});应能解决此问题,这将包括出现任何字符。“1”
->true,“12”
->false.Hehe.好的。让我们在组中添加一个检查。更新的示例它起作用,但这只是因为您正在检查以前创建的混乱的每个结果。您的正则表达式所做的就是查找空字符串(对于非字符)或者a
。因此您的正则表达式没有帮助,反而使一切变得更加复杂。更简单的方法是迭代每个字符(例如使用string.charAt(i)
),并将其与a
进行比较。
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);
}
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 ;
}