繁体   English   中英

用php中的正则表达式查找罗马数字

[英]Regular expression in php to find roman numerals

我使用PHP突出显示字符串中的所有roman数字。

例如:

Protocol XXXIV/14 from session...

Protocol XXIX/13  from session...

Protocol XXXV/13  from session...

因此,我在http://regexr.com/2uhln上找到了一个完美的例子。 它适用于上面的示例,但是当我尝试在php中使用它时,它将停止工作。

我的PHP代码是

    $subject = "Protocol XXXV/13  from session...";
    $pattern ='/(?:XL|L|L?(?:IX|X{1,3}|X{0,3}(?:IX|IV|V|V?I{1,3})))/';
    preg_match($pattern,$subject,$matches);

它仅从罗马数字输出1-3个字符,因此

XXXIV - gives XXX

XXIX - gives XX

XXXV - gives XXX 

我有两个问题:

  1. 怎么了? 如何解决?
  2. 如何从http://regexr.com/2uhln修改正则表达式以适用于所有罗马数字(最多100个)(罗马C)。 它不能正常工作。 XLVII,XLVI,XLV。

更改图案的顺序。 也就是说,将最长的图案放在最前面,然后将中等的图案放在最后,然后将其短。 语法就像long|medium|short 这样最长的字符串将首先被匹配。

$re = "~L?(?:X{0,3}(?:IX|IV|V|V?I{1,3})|IX|X{1,3})|XL|L~m";
$str = "Protocol XXXIV/14 from session...\nProtocol XXIX/13 from session...\nProtocol XXXV/13 from session...";
preg_match_all($re, $str, $matches);
print_r($matches);

更新:

\b(?:X?L?(?:X{0,3}(?:IX|IV|V|V?I{1,3})|IX|X{1,3})|XL|L)\b

DEMO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM