Как сопоставить только действительные римские цифры с регулярным выражением? - PullRequest
147 голосов
/ 06 ноября 2008

Думая о моей другой проблеме , я решил, что не могу даже создать регулярное выражение, которое будет соответствовать римским цифрам (не говоря уже о неконтекстной грамматике, которая будет генерировать их)

Проблема в сопоставлении только действительных римских цифр. Например, 990 это не "XM", это "CMXC"

Моя проблема в создании регулярного выражения для этого заключается в том, что для того, чтобы разрешить или запретить определенные символы, мне нужно оглянуться назад. Возьмем, к примеру, тысячи и сотни.

Я могу допустить M {0,2} C? M (чтобы учесть 900, 1000, 1900, 2000, 2900 и 3000). Однако, если совпадение на CM, я не могу допустить, чтобы следующие символы были C или D (потому что я уже на 900).

Как я могу выразить это в регулярном выражении?
Если это просто невозможно выразить в регулярном выражении, можно ли это выразить в контекстно-свободной грамматике?

Ответы [ 11 ]

0 голосов
/ 16 марта 2011

Проблема решения от Джереми и Пакса состоит в том, что оно также соответствует «ничему».

Следующее регулярное выражение ожидает хотя бы одну римскую цифру:

^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|[IDCXMLV])$
...