簡體   English   中英

僅使用正則表達式匹配羅馬數字

[英]Match only roman numerals with regular expression

我正在嘗試創建一個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

您可以使用[ ]\\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

<?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]+$/' 。+ '/(.+\\s+)[CILMVX]+$/'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM