Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅将罗马数字与正则表达式匹配_Php_Regex - Fatal编程技术网

Php 仅将罗马数字与正则表达式匹配

Php 仅将罗马数字与正则表达式匹配,php,regex,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 -

我试图创建一个只匹配罗马数字的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

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

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

仅包括有效的罗马数字

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


看。

你试过什么了吗?你想删除的每个罗马数字前面都有空格吗?@mgutt是的,每个罗马数字前后都有空格,每个或每个你想删除的数字?@karthikmanchala谢谢,从模式中删除了
p
。对不起,我对罗马数字不太流利…要检查有效的罗马数字真的很难。。所以我想我可以提出一个观点你说得对。。但是php引擎也包括pcre正则表达式。。这就是为什么pcre(php):)你认为这是一个很好的答案:)
<?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