4

我有正则表达式

(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(两者之间)......

我究竟做错了什么?

4

1 回答 1

2

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

试试这个

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

在 Regexr 上查看

这将匹配


、二。
三、
四。
五、
六。
七。
八。
九。
X。

但不是

十一。人机界面。MMXI。
一些事情

您匹配罗马数字的方法远非正确,匹配罗马数字的方法更正确,对于直到 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 并且还有更多。

关于罗马数字的维基百科

于 2011-08-18T08:51:43.537 回答