我正在尝试匹配以下格式的字符串:
S->A
S->AbCd
S->A|b|C|d
S->Ab|B|cde|dB
也就是说,在最左边正好有一个大写的拉丁字母符号,后跟“->”字面量。在该文字之后正好是一个大写/非大写拉丁字母符号或此类符号的串联,这些符号后面也可以跟以“|”分隔的此类符号组 象征。
此外,我不仅想检查整个字符串是否符合这种格式,而且还能够捕获最左边的大写符号和 '->' 文字之后的所有符号组。到目前为止,我已经想出了这个正则表达式:
([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]+))*
应该匹配所有分隔符号组。我相信这与“重复捕获组与捕获重复组”一文中描述的内容有关。我试着摆弄一下我的正则表达式,但仍然没有得到令人满意的结果。有什么建议么?