2

たとえば、一致する正規表現を作成しようとしています。

b
abab
babab

だがしかし

bb
babb
aaaba
abaaba

現時点では、私は持っていてa(b)|b(a)、それは働いていababます。や など、最初と最後の文字がありませbbabab

したがって、単語の末尾にa単独または単独または文字を指定する必要があります (その前の文字がそれ自体でない場合)。bしかし、私はそれを行う方法を理解できません。

http://www.rexv.org/ (Perl PCRE) を使用して試しています。

みんなありがとう、しかし私は言及するのを忘れていました:空の文字列も一致させることができ、私は次のものしか使用できません

* ? +

|

()

.

みんなありがとう!、

http://www.rexv.org/で正しく機能するように文字列の先頭と末尾を指定できなければ、それは不可能だと思います

4

4 に答える 4

2

次のようなことを試してください:

^((?:(?:ab)*a?)|(?:(?:ba)*b?))$

説明:

^(                   # beginning of the string
    (?:
        (?:ab)*      # matches any repeating `ab` group
        a?           # group can optionally end with an `a`
    )
    |
    (?:
        (?:ba)*      # matches any repeating `ba` group
        b?           # group can optionally end with a `b`
    )
)$                   # end of the string

(?:正規表現全体の周りに完全なキャプチャ グループを使用して、サブグループを非キャプチャとして含めます。これにより、各サブグループのノイズではなく、一致する完全な文字列のみが確実に返されます。

このアプローチの注意点は、「空の」文字列も一致することです。

更新(限定された文字セット) 限定された文字
セットは上記のパターンで引き続き機能しますが、一致しないグループ部分 ( ?:) を削除する必要があります。正規表現は次のようになります。

(((ab)*a?)|((ba)*b?))

上記の警告は、空の文字列にも一致するということですが、これは必要なもののように見えるので、それをボーナスリストに追加できます!

^使用できる文字セットに関するわずかな問題は、文字列の開始と終了をそれぞれ示すと$文字を使用できないことです。これに関する問題は、一致するサブパターン(使用する正規表現に関係なく) が入力を有効としてフラグ付けすることです。私はこれが説明されていると仮定しています。

于 2012-12-04T05:48:16.943 に答える
0

複雑な一致正規表現を作成する代わりに、単純な正規表現を使用して繰り返し文字を一致させ、その逆を次のように使用します。

    String stringToMatch = "babaab";
    Pattern p1 = Pattern.compile("^[ab]+$");//match the a`s and b`s kind of string
    Pattern p2 = Pattern.compile("([ab])\\1+");//match the repeating a`s and b`s
    Matcher m1 = p1.matcher(stringToMatch);
    Matcher m2 = p2.matcher(stringToMatch);
    if (m1.find() && !m2.find()){//validates it has a's and b's but not repeating
       //valid string
    }

任意の単語文字に一致させるには、単に次を使用します(\\w)\\1+。これはそれの最良の部分です。シンプルで拡張可能で、abcdabcdなどのより多くの文字セットをカバーします。

于 2012-12-04T05:57:33.480 に答える
0

これを試してください:

^((b?(ab)*a?)|(a?(ba)*b?))$

これは、アルファベットがに制限されていることを前提としています{a, b}

于 2012-12-04T06:11:46.150 に答える
0

編集: -

look-aheadアサーションを使用したくない場合はlook-behind、次の正規表現を使用できます: -

"b?(ab)*|a?(ba)*"  // Will also match `empty string`

説明 : -

b?   // 0 or 1 b
(    // capture group. 
  ab // Match ab
)*   // group close `0 or more repetition

|

a?(ba)*  // Same with `a` replaced with `b`, and `b` with `a`

古い回答: -

この正規表現を使用します: -

"((?<!a)a|(?<!b)b)*"   // This will also match empty string

a別の が先行していないものと一致しaます。についても同じですb

(            // Capture group
    (?<!     // Negative Look-behind assertion
        a    // on a
    )
     a       // Match a

    |        // or

    (?<!     // Negative Look-behind assertion
        b    // on b
    )
     b       // Match b
)                 // Close capture group
+  // 1 or more repetition
于 2012-12-04T05:47:56.737 に答える