0

私はこのコードを使用しています

Matcher m2 = Pattern.compile("\\b[ABE]+\\b").matcher(key);

HashMap文字 A、B、または E を含むa からキーのみを取得する

AAAAAA や EEEEE などの単語には興味がありませんが、少なくとも 2 文字 (できれば 3 文字) の単語が必要です。

正規表現を変更する方法はありますか? 誰でもこれについて洞察を提供できますか?

4

3 に答える 3

1

文字以外のすべてを置き換え、結果のセットを作成し、セットのサイズをテストします。

public static void main (String args[])
{
    String alphabet = "ABC";
    String totest = "BBA";

    if (args.length == 2)
    {
        alphabet = args[0];
        totest = args[1];
    }
    String cleared = totest.replaceAll ("[^" + alphabet + "]", "");
    char[] ca = cleared.toCharArray ();
    Set <Character> unique = new HashSet <Character> ();
    for (char c: ca)
        unique.add (c);
    System.out.println ("Result: " + (unique.size () > 1));
}

実装例

于 2012-12-06T00:20:25.073 に答える
0

より複雑な正規表現を使用してそれを行うことができます。

(.*A.*[BE].*|.*[BE].*A.*)|(.*B.*[AE].*|.*[AE].*B.*)|(.*E.*[BA].*|.*[BA].*E.*)

しかし、おそらく、何らかの置換を行う方が理解しやすいでしょう。たとえば、一度に 1 文字ずつ '' に置き換えるループを作成し、新しい文字列のサイズを毎回チェックします。文字列を 2 回入力すると、目的の文字が 2 つ得られます。EDIT:実際には、チェックを行うに実行時に必要な文字のセットを知っている場合、 NullUserException は彼のコメントに正しくありました-indexOfまたはcontains、これよりも効率的でおそらく読みやすいでしょう。

必要な文字のセットがコンパイル時に不明な場合 (または少なくとも実行時に事前に文字列をチェックする場合) は、2 番目のオプションが望ましいことに注意してください。任意の文字を探している場合は、ループ - ループを通過するwhile(str.length > 0)回数は、取得した異なる文字の数です。

于 2012-12-06T00:37:57.037 に答える
-1

目的の文字の繰り返しを明示的にマークします。次のようになります。

  \b[ABE]{1,3}\b

AAE、EEE、AEE に一致しますが、AAAA、AAEE には一致しません

于 2012-12-06T00:27:07.403 に答える