Я пытаюсь соответствовать строки следующего формата:Не удается захватить группы в строке с помощью Regex
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]+))*
должны соответствовать ВСЕХ разграниченных группам символов. Я считаю, что это связано с тем, что описано в статье 'Repeating a Capturing Group vs. Capturing a Repeated Group'. Я пытался немного поиграть с моим регулярным выражением, но все же не получил удовлетворительных результатов. Какие-либо предложения?
На каком языке находится регулярное выражение? –
Если левая часть должна быть латинской буквой, вы должны удалить [a-z] - часть. –