5

有没有办法regular expression在 Java 中编写 a 来判断 a 是否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;
    }

例如,如果将 String"jsadaajaaikadjasl"作为参数传递,则返回 true,因为它包含 7 "a"。有没有更优雅的方法来实现它只使用 aregex并检查它:

Pattern p = Pattern.compile(...);
Matcher m = p.matcher(s);
if(m.matches())
   return true;  

?

4

8 回答 8

4

只需创建一个匹配偶数计数的模式,例如"(?:[^a]*a[^a]*a)*"添加另一个事件,(?:[^a]*a[^a]*a)*[^a]*a[^a]. 现在如果匹配器。matches返回true你有奇数次出现。

于 2013-09-18T14:35:46.350 回答
3

我不知道你为什么要在这里使用正则表达式(我不确定我是否想知道),但你可以尝试使用[^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标志 from oddtoeven或反之亦然。

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
于 2013-09-18T15:01:30.840 回答
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因为您的问题暗示您想知道 String 是否出现数次。

于 2013-09-18T14:37:28.103 回答
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
于 2013-09-18T14:42:08.907 回答
0

奇怪的:"^[^a]*(a[^a]*a[^a]*)*a[^a]*$"

甚至:"^([^a]*a[^a]*a[^a]*)+$"

于 2013-09-18T14:50:38.750 回答
0
(?:([^a]*a[^a]*a[^a]*)*)

匹配偶数个a

[^a]*a(?:([^a]*a[^a]*a[^a]*)*)

匹配奇数个a.

于 2013-09-18T14:55:31.707 回答
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);
}
于 2013-09-18T15:22:07.323 回答
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 ;
}
于 2013-09-18T19:26:23.670 回答