0

5つのaと5つのbを持つすべての文字列に一致する正規表現を作成することは可能ですか?

aaaaabbbbbまたはabababababまたはaabbaabbabのように。

決定論的エンジンには多項式時間が必要だと思います。

そのようなマッチングを可能にする他のマッチング言語はありますか?

更新

こういう表現を使って検索したかったので、目的の表現に変えてみたら(?=b*ab*){5}(?=a*ba*){5}([ab]{10})うまくいきました!:)そのような表現のパフォーマンスについてはまだよくわかりません。しかし、私は先読みの表現を調べることができると思います。

説明は簡単だが正規表現が難しい他の種類のパターンがそこにあるのか、私はまだ興味がありますか?

4

2 に答える 2

6

私はこれらすべてのネジを持っています。それらをこの木片に打ち込むには、爪またはボールピーンハンマーを使用する必要がありますか?

それは(大まかに)あなたの質問が尋ねていることです。あなたがすべきことは、文字列の各文字をループするだけです。私はCでそれを行うことができます。ウォッチ:

int validate(char *s)
{
    int a = 0, a = 0;
    while(*s)
      {
        switch(*s++)
        {
        case 'a':
            a++;
            break;
        case 'b':
            b++;
            break;
        }
      }
    return a == 5 && b == 5;
}

これは、a)選択した言語に変換する、b)'a'と'b'の連続するシーケンスのみに一致するように変更する、または他の特定の要件に合わせて調整するための演習として残されています。

基本的なポイントは、このジョブには正規表現よりもはるかに優れたツールがあるため、「a」と「b」がより複雑な正規表現の代用でない限り、これに正規表現を使用しないでください。また、「a」と「b」が実際にはより複雑な正規表現である場合でも、1つの正規表現ですべての問題を解決してすべてを支配する必要はありません。いくつかの便利な正規表現と(上記のような)コードのループを組み合わせて、巨大な(そして保守不可能な)正規表現-zillaよりもはるかに大きな効果を得ることができます。

于 2010-01-24T20:17:24.457 に答える
4

先読みアサーションを使用できます:

^(?=(?:[^a]*a){5}[^a]*$)(?=(?:[^b]*b){5}[^b]*$)
于 2010-01-24T20:01:28.443 に答える