次の形式の文字列を一致させようとしています。
S->A
S->AbCd
S->A|b|C|d
S->Ab|B|cde|dB
つまり、左端には、大文字のラテンアルファベット記号が1つだけあり、その後に「->」リテラルが続きます。その後、リテラルは、大文字/非大文字のラテンアルファベット記号またはそのような記号の連結の後に続きます。これらの記号の後には、「|」で区切られた記号のグループも続く場合があります。シンボル。
また、文字列全体がこの形式に準拠しているかどうかを確認するだけでなく、左端の大文字記号と「->」リテラルの後のすべての記号グループの両方をキャプチャできるようにします。これまでのところ、私はこの正規表現を思いついた:
([A-Z]{1})->([a-zA-Z]+)(?:(?:\|)([a-zA-Z]+))*
たとえば、次の文字列に対してテストすると、次のようになります。
S->Ab|B|c|d
次の結果が得られます(RegexBuddyでテストを行いました)。
Match 1: S->Ab|B|c|d
Group 1: S
Group 2: Ab
Group 3: d
良いことは、私の正規表現が文字列全体と一致することです(これは正しいです)。ただし、問題は明らかです。私の正規表現は、「->」リテラルの後の最初と最後のシンボルグループのみをキャプチャします。なんで?正規表現の私の理解に基づいて、表現のこの部分
(?:(?:\|)([a-zA-Z]+))*
すべての区切られたシンボルグループと一致する必要があります。これは、 「キャプチャグループの繰り返しと繰り返しグループのキャプチャ」の記事で説明されている内容に関連していると思います。正規表現を少しいじってみましたが、満足のいく結果が得られませんでした。助言がありますか?