5

a に特定の文字の奇数が含まれてregular expressionいるかどうかを確認する Java で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;
    }

たとえば、文字列"jsadaajaaikadjasl"をパラメーターとして渡すと、7 が含まれているため、true が返されます"a"regexa のみを使用してそれを次のようにチェックする、よりエレガントな方法はありますか?

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 に答える
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;      

また、あなたの質問は、 Stringの出現回数が奇数hasOddNumberかどうかを知りたいことを意味しているため、メソッド名を に変更します。

于 2013-09-18T14:37:28.103 に答える
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 に答える
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]*)*)

aandの偶数に一致

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

の奇数に一致しますa

于 2013-09-18T14:55:31.707 に答える
0

奇数:"^[^a]*(a[^a]*a[^a]*)*a[^a]*$"

平:"^([^a]*a[^a]*a[^a]*)+$"

于 2013-09-18T14:50:38.750 に答える
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 に答える