1

有限状態マシンを構築しようとしていますが、取得したシーケンスを正規表現で確認したいと考えています。シーケンスが次のフォームからのものかどうかを確認する必要があります。

例えば:

"A,B,C,C,C,C,C,A"→受け付けます。

"A,B,C,C,C,C,A"-> は無視されます。

"A,B,C,C,C,C,C,C,A"-> は無視されます。

この投稿とその投稿を見つけましたが、試したすべてが機能しません。

次のことを試してみましA\B\D{5}\AABD{5}A:

編集: C 文字が正確に 5 回返されるかどうかを知りたいです。前後はまったく関係ありません。つまり、次のようになる可能性もあります。

A、A、A、F、F、R、E、D、C、C、C、C、C、......

コンマは考慮しないでください。

問題は、シーケンスが受け入れられるかどうかを調べる必要があることですが、シーケンスは次の形式からのものです: A、B、C*10、マシン クラス、状態クラス、およびイベント クラスを作成しました。しかし、C のリターンが正確に 5 回あるかどうかを知る必要があり、多くの問題が発生しています。

編集: 機能していません。追加したコードを参照してください。

String sequence1 = "A,B,C,C,C,C,A";
String sequence2 = "A,B,C,C,C,C,C,A";
String sequence3 = "A,B,C,C,C,C,C,C,A";
Pattern mPattern = Pattern.compile("(\\w)(?:,\\1){4}");
Matcher m = mPattern.matcher(sequance1);
m.matches(); //FALSE
Matcher m = mPattern.matcher(sequance2);
m.matches(); //FALSE
Matcher m = mPattern.matcher(sequance3);
m.matches(); //FALSE

常に false を返します。

どうすればこれを達成できますか?

ありがとう。

4

2 に答える 2

4

文字列内のコンマを考慮していないため、正規表現が機能していません。これは使用可能であると思います。

次の正規表現を試すことができます(ここに一般化されたパターンを投稿しています。それに応じて変更できます):-

"(\\w)(?:,\\1){4}"

これは、コンマで区切られた同じ文字の5つのシーケンスに一致します。

\1は最初に一致した文字を逆参照するために使用され、残りの4文字はそれと同じである必要があります。

説明: -

"(         // 1st capture group
   \\w     // Start with a character
 )
 (?:       // Non-capturing group
    ,      // Match `,` after `C`
    \\1    // Backreference to 1st capture group. 
           // Match the same character as in (\\w)
 ){4}"     // Group close. Match 4 times 
           // As 1st one we have already matched in (\\w)

アップデート: -

シーケンスを一致させたいだけの場合は5 length、5回目の一致の後に一致した文字の否定を追加できます。-

"(\\w)(?:,\\1){4}(?!,\\1)"

(?!,\\1)->否定的な先読みアサーションです。同じ文字が続かない5つの連続した文字と一致します。

アップデート: -

上記の正規表現では、ネガティブな後読みも行う必要がありますが、\\1これはできません。だから、私はこの奇妙な見た目の正規表現を思いついた。私自身は好きではありませんが、うまくいくかどうかにかかわらず試してみることができます:-

テストされていません:-

"(\\w),(^\\1)(?:,\\2){4}(?!,\\2)"

説明: -

(       // First Capture Group
  \\w   // Any character, before your required sequence. (e.g. `A` in `A,C,C,C,C,C`)
)       // Group end
,       // comma after `A`

(          // Captured group 2
   ^\\1    // Character other than the one in the first captured group. 
           // Since, We now want sequence of `C` after `A`
)
(?:        // non-capturing group
   ,       // Match comma
   \\2     // match the 2nd capture group character. Which is different from `A`, 
           // and same as the one in group 2, may be `C`

){4}       // Match 4 times

(?!        // Negative look-ahead
    ,
    \\2    // for the 2nd captured group, `C`
)

その説明が最も理にかなっているかどうかはわかりません。しかし、あなたはそれを試すことができます。それがうまくいき、理解できない場合は、もう少し詳しく説明しようと思います。

于 2012-11-09T12:20:43.043 に答える
2

何を試したかわかりませんが、文字をエスケープして一致させる必要はありません。

要件が何であるかはわかりませんが、5つの繰り返し文字を見つけるには、次を使用できます。

(\\p{L})(?:,\\1){4}

これにより、5回繰り返されるすべての文字が検索されます。ここRegexrでそれを参照してください。

正規表現ではサポートされていない\wため使用\p{L}しましたが、Javaでサポートされています。

\p{L}は、任意の言語のすべての文字に一致するUnicodeプロパティです。

  1. ここでのアイデアは、文字を一致させることです。これはによって行われ\\p{L}ます。

  2. の周りに角かっこがあるため、この文字は後方参照に格納されます(\\p{L})

  3. 次に、非キャプチャグループがあり(?:,\\1)ます。これはコンマと一致し、\\1は前にキャプチャされた文字への参照です。

  4. この非キャプチャグループは4回繰り返され(?:,\\1){4}ます。

==>結果として、このパターンは、間にコンマを含む5つの同一の文字に一致します。

ここでの問題は、この式が少なくとも5つの同一の文字と一致することです。それらがもっとある場合、それも(部分的に)一致します。

アップデート:

正規表現から直接結果を取得する機会はありません。ただし、長さを間接的に取得する方法は次のとおりです。

String[] TestInput = { "A,B,C,C,C,C,C", "A,B,C,C,C,C,C,D,E",
        "C,C,C,C,C", "C,C,C,C,C,D,E", "A,B,C,C,C,C", "C,C,C,C",
        "A,B,C,C,C,C,C,C,D,E", "C,C,C,C,C,C,D,E", "C,C,C,C,C,C" };

// Match at least 5 letters in a row
// The letter is in group 2
// The complete found sequence is in group 1
Pattern p = Pattern.compile("((\\p{L})(?:,\\2){4,})");

for (String t : TestInput) {
    Matcher m = p.matcher(t);
        if (m.find()) {

            // Get the length of the found sequence, after the commas has
            // been removed
            int letterLength = m.group(1).toString().replace(",", "")
                    .length();
            // Check your condition of exactly 5 equal letters
            if (letterLength == 5) {
                System.out.println(t + " ==> " + true);
            } else {
                System.out.println(t + " ==> " + false);
            }
        }else {
            System.out.println(t + " ==> " + false);
        }
}

出力:

A、B、C、C、C、C、C ==>真
のA、B、C、C、C、C、C、D、E ==>真の
C、C、C、C、C ==> true
C、C、C、C、C、D、E ==> true
A、B、C、C、C、C ==> false
C、C、C、C ==> false
A、B、C、 C、C、C、C、C、D、E ==> false
C、C、C、C、C、C、D、E ==> false
C、C、C、C、C、C ==> false

于 2012-11-09T12:20:42.350 に答える