我有正则表达式
(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(两者之间)......
我做错了什么?
答案 0 :(得分:2)
在VI
之前,空间在写入之前总是属于替代方案而没有空间,而不是全部。它所属的\.
始终与写入的替代方案相同。
试试这个
" (IX|IV|V?I{0,3}|M{1,4}|CM|CD|D?C{1,3}|XC|XL|L?X{1,3})\."
这将匹配
予。
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})))$
我仅在表面上对此进行了测试,但是你会发现这真的很复杂,在这个表达式中,C,D和M仍然缺失。
不要谈论特殊情况,例如4 = IV = IIII,其中有更多。