php - 匹配罗马数字

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

我做错了什么?

最佳答案

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

这将匹配

一.
二、
三、
四、
五、
六、
七、
八、
九、
十、

但不是

十一。 人机接口(interface)。 MMXI.
一些东西

你匹配罗马数字的方法远非正确,匹配罗马数字更正确的方法是这个,直到数字 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

关于php - 匹配罗马数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7104623/

相关文章:

VB.Net - Char.IsNumber 输入罗马数字

matlab - Octave/MATLAB函数将罗马数字转换成十进制数

PHP JSON GET 在网页上正确显示,但在 php 中不正确

PHPmailer 和 pdf 附件

python - 如何用正则表达式匹配一定长度的字符串

ios - 在 Swift 中搜索以\n\n 开头的字符串

JavaScript 替换所有忽略大小写敏感

php - 应该如何用PHP(简单的html dom解析器)解析网页的背景图像和其他图像?

c# - 从 C# 发送的 JSON 但未在 php 中作为 JSON 接收

sql - PostgreSQL:如何优雅地返回带有单空格分隔的罗马日期?