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())

有没有办法在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())
            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
我说了“use
matches
”。但是我忘记了重复。修复了。结果将与
“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 ;
}