ホーム>source

次の文字列があるとします。

<前>ウィズウィズ

3つの一致を返すRegexパターンを作成します。一致はそれぞれ "abc"です。ただし、文字列が繰り返される「abc」パターンからまったく逸脱している場合、どのような一致も返しません。

また、繰り返しが常に3つあるかどうかはわかりません(繰り返しはいくつでも可能です)。

たとえば、次の文字列は失敗し、一致する必要はありません。

<前>ウィズウィズ

どのパターンを使用すれば3つの一致が返されますかgoodStr、ただし0はbadStr

つまり、最後に一致したインデックスと長さの合計は、対象の文字列の全長と等しくなければなりません。

このシナリオでも、キャプチャ/後方参照を使用しないようにしています。

編集:

パターン^(?: abc)+ $ 1つの一致のみを返すため、これでは不十分です。

パターン^ abcabcabc $ 「abc」は3回しか繰り返されないと想定しているため、十分ではありません。また、私のシナリオでは、繰り返しの回数がわかりません。また、1つの一致のみを返します。

ウィズウィズ var goodStr = "abcabcabc";
あなたの答え
  • 解決した方法 # 1

    あなたはC#で以下を使用できるはずです:

    <前>ウィズウィズ

    これは (?<=^(?:abc)*)abc(?=(?:abc)*$) の発生と一致します   abc の他の繰り返しだけを使用して、文字列の先頭と末尾の両方に到達できます 。これは、非常にまれですが、C#の正規表現エンジンが実装する可変幅後読みを使用する能力に依存しています。

    私はそれを abc に対して3つの一致を返すhttp://regexstorm.net/testerでテストすることができました   abcabcabc の場合は0 。

  • 解決した方法 # 2

    PHPは動的な後読みをサポートしていないため、 abcabcabc123 を使用してこの正規表現を使用できます :

    <前>ウィズウィズ

    RegExデモ

    ウィズウィズ  前の一致の最後または最初の一致の文字列の先頭に位置をアサートします。

    さらにいくつかの反復の後、この正規表現は最も効率的であることがわかります。

    <前>ウィズウィズ

    RegExデモ2

  • 解決した方法 # 3

    あなたは \G を使うことができます  肯定的な先読みと組み合わせて。ウィズウィズ  文字列の先頭で一致するか、前の一致の末尾で位置をアサートします。

    abcをキャプチャして、右側にあるものが文字列の終わりまでのグループの繰り返しかどうかを確認できます。

    <前>ウィズウィズ

    正規表現のデモ

    (?:^(?=(?:abc)+$)|(?!^)\G)abc

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ Cordaオブザーバーは、未使用のトランザクションのみを追跡しますか?