正则表达式查找特定字符是否在String中存在奇数次

时间:2013-09-18 14:31:33

标签: java regex string

有没有办法在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;  

8 个答案:

答案 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

你可以使用这个简单的方法来代替正则表达式,它会迭代所有的字符串字符,将它们与搜索的字符进行比较,每次找到匹配从booleanodd的匹配翻转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 ;
}