匹配罗马数字

时间:2011-08-18 08:41:39

标签: php regex roman-numerals

我有正则表达式

(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 个答案:

答案 0 :(得分:2)

VI之前,空间在写入之前总是属于替代方案而没有空间,而不是全部。它所属的\.始终与写入的替代方案相同。

试试这个

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

here on Regexr

这将匹配

予。
 II。
 III。
 IV。
 五
 VI。
 七,
 八,
 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})))$

here on Regexr

我仅在表面上对此进行了测试,但是你会发现这真的很复杂,在这个表达式中,C,D和M仍然缺失。

不要谈论特殊情况,例如4 = IV = IIII,其中有更多。

Wikipedia about Roman numbers