仅使用正则表达式匹配罗马数字

时间:2015-04-12 07:11:36

标签: php regex

我正在尝试创建一个reg exp以仅匹配罗马数字,并且只有在之前有其他字符时才删除它们。 如果罗马数字之前没有其他字符,那么我不想删除它。 这是一个例子:

string1 V
string2 VI
string3 XX
STRING4 I
STRING5 1340 I
2 STRING6 III
STRING7 V
STRING8 III
STRING9 II
STRING10 IV
STRING11 STRING12 VI
STRING13! IX
STRING14 VI
. STRING15 - STRING16_ V
STRING17 1/2 VI
STRING18 VIII
XIII (2011)
V (2012)
String19 VP
XII

结果应该是:

string1
string2
string3
STRING4
STRING5 1340
2 STRING6
STRING7
STRING8
STRING9
STRING10
STRING11 STRING12
STRING13!
STRING14
. STRING15 - STRING16_
STRING17 1/2
STRING18
XIII (2011)
V (2012)
String19 VP
XII

请帮忙吗?

由于

修改:我刚试过这个:\b[IVXLCDM]+\b但它匹配:

XIII (2011)
V (2012)
XII

2 个答案:

答案 0 :(得分:5)

您可以使用[ ]\bM{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b

仅包含有效 ROMAN NUMERALS。

如果您想在未经验证的情况下加入罗马人,可以使用[ ]([MDCLXVI]+$)

请参阅DEMO

答案 1 :(得分:0)

<?php

$subjects = <<< EOT
string1 V
string2 VI
string3 XX
STRING4 I
STRING5 1340 I
2 STRING6 III
STRING7 V
STRING8 III
STRING9 II
STRING10 IV
STRING11 STRING12 VI
STRING13! IX
STRING14 VI
. STRING15 - STRING16_ V
STRING17 1/2 VI
STRING18 VIII
XIII (2011)
V (2012)
String19 VP
XII
EOT;

foreach (explode("\n",$subjects) as $subject) {
  $pattern = '/(.+)\s+[IVXLCDM]+\s*$/';
  echo preg_replace($pattern, '\\1', $subject)."\n";
}

这给出了输出:

string1
string2
string3
STRING4
STRING5 1340
2 STRING6
STRING7
STRING8
STRING9
STRING10
STRING11 STRING12
STRING13!
STRING14
. STRING15 - STRING16_
STRING17 1/2
STRING18
XIII (2011)
V (2012)
String19 VP
XII

注意:这也会删除前一个文本和删除的罗马数字序列之间的任何空格。如果您想保留这些内容,则必须先将\n移到括号中'/(.+\s+)[CILMVX]+$/'