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)
但罗马数字的格式始终是这样的:“四” ......我在eregi例如空格加号之前和“”数字后,但我仍然得到相同的结果。如果文本是像“somethinvianyyhing”的结果将是六(两者之间)...
我做错了什么?
同样在SO:http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression – kapa
我纠正我的解决方案和Regexr链接。 – stema
有一个Perl模块可以正确处理罗马数字。知道你有一个方法是先*匹配'/ \ b([ivxldcm] +)\ b/i'然后*然后*检查'Roman :: isroman($ 1)'是否返回true。否则你会得到错误的答案。它只能用于ASCII,这意味着它只能达到4000.最长的这种合法字符串是'MMMDCCCLXXXVIII'。使用Unicode,你可以高得多,因为你有更大的罗马数字,例如ↂ为10,000 *&c *,而且你也可以使用macron或overline来获得1000倍的基本字符。我有一个模块可以处理所有这些,但它当然是用Perl编写的 – tchrist