У меня регулярное выражение
(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 (между обоими) …
Что я делаю не так?
У вас нет места перед VI
пространство всегда принадлежит альтернативе до того, как оно будет написано, а не всем. То же самое для \.
он всегда относится к альтернативе, где он был написан.
Попробуй это
" (IX|IV|V?I{0,3}|M{1,4}|CM|CD|D?C{1,3}|XC|XL|L?X{1,3})\."
См. Здесь, в Regexr
Это будет соответствовать
Я.
II.
III.
Внутривенно
V.
VI.
VII.
VIII.
IX.
ИКС.
Но нет
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, и их больше.
Википедия о римских цифрах