Более краткий способ сопоставления регулярных выражений необязательных частей строки - PullRequest
2 голосов
/ 04 апреля 2011

Я пишу шаблоны лексера Flex для соответствия ряду команд.В отличие от клиента командной строки Subversion, команды могут быть сокращены до небольшой, но однозначной длины.

Таким образом, такую ​​команду, как:

MYCOMMAND

Можно ввести как:

MYCOMMAND
MCOMMAND
MYCOM
MC

Шаблон, который я неосознанно писал для этих случаев, выглядит следующим образом:

M(Y)?C(O|OM|OMM|OMMA|OMMAN|OMMAND)?

И он отлично работает, но пахнет довольно плохо, особенно на очень длинных определениях, есть ли более короткий путьопределение такого совпадения?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Если вы можете использовать символ конца токена, например $ или \b, тогда вы можете сделать:

MY?C(O|$)(M|$)(M|$)(A|$)(N|$)(D|$)
1 голос
/ 04 апреля 2011

А как же MY?C(O(M(M(A(ND?)?)?)?)?)?; -)
ИМХО, это единственный способ написать это.

...