我有正则表达式
(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})\."
这将匹配
一.
二、
三、
四、
五、
六、
七、
八、
九、
十、
但不是
十一。
人机接口(interface)。
MMXI.
一些东西
你匹配罗马数字的方法远非正确,匹配罗马数字更正确的方法是这个,直到数字 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 还有更多。
关于php - 匹配罗马数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7104623/