Соответствующие римские цифры - PullRequest
4 голосов
/ 18 августа 2011

У меня есть регулярное выражение

(IX|IV|V?I{0,3}|M{1,4}|CM|CD|D?C{1,3}|XC|XL|L?X{1,3})

Я использую его, чтобы определить, есть ли в тексте римское число.

eregi("( IX|IV|V?I{0,3}[\.]| M{1,4}[\.]| CM|CD|D?C{1,3}[\.]| XC|XL|L?X{1,3}[\.])", $title, $regs)

Но формат римского числа всегда такой: «IV.» ... Я добавил в пример eregi пробел перед числом и «.» после номера, но я все еще получаю тот же результат. Если текст похож на «somethinvianyyhing», результатом будет vi (между обоими) ...

Что я делаю не так?

1 Ответ

2 голосов
/ 18 августа 2011

У вас нет пробела до VI пробел принадлежит всегда альтернативе до того, как она была написана, а не всем.То же самое для \., оно всегда принадлежит альтернативе, в которой оно было написано.

Попробуйте это

" (IX|IV|V?I{0,3}|M{1,4}|CM|CD|D?C{1,3}|XC|XL|L?X{1,3})\."

См. здесь на Regexr

Это будет соответствовать

I.
II.
III.
IV.
V.
VI.
VII.
VIII.
IX.
X.

Но не

XI.MMI.MMXI.
somethinvianyyhing

Ваш подход к сопоставлению римских чисел далек от правильного , подход к сопоставлению римских чисел более корректен, для чисел до 50 (L)

^(?:XL|L|L?(?:IX|X{1,3}|X{0,3}(?:IX|IV|V|V?I{1,3})))$

Посмотрите на это здесь на Regexr

Я проверил это только на поверхности, но вы видите, что это действительно станет сложным и в этом выражении C, D и Mвсе еще отсутствуют.

Не говоря уже об особых случаях, например, 4 = IV = IIII, и их больше.

Википедия о римских числах

...