2011-08-18 77 views
4

我的正則表達式匹配羅馬數字

(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) 

但羅馬數字的格式始終是這樣的:「四」 ......我在eregi例如空格加號之前和「」數字後,但我仍然得到相同的結果。如果文本是像「somethinvianyyhing」的結果將是六(兩者之間)...

我做錯了什麼?

回答

2

您在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

這將匹配


II。三,四,
V.
六, VII。 VIII。九,

但不是

XI。 MMI。 MMXI。
somethinvianyyhing

你的方法來匹配羅馬數字還遠不是正確,匹配羅馬數字更正確的做法是這樣的,換號至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

+0

同樣在SO:http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression – kapa

+0

我糾正我的解決方案和Regexr鏈接。 – stema

+2

有一個Perl模塊可以正確處理羅馬數字。知道你有一個方法是先*匹配'/ \ b([ivxldcm] +)\ b/i'然後*然後*檢查'Roman :: isroman($ 1)'是否返回true。否則你會得到錯誤的答案。它只能用於ASCII,這意味着它只能達到4000.最長的這種合法字符串是'MMMDCCCLXXXVIII'。使用Unicode,你可以高得多,因爲你有更大的羅馬數字,例如ↂ爲10,000 *&c *,而且你也可以使用macron或overline來獲得1000倍的基本字符。我有一個模塊可以處理所有這些,但它當然是用Perl編寫的 – tchrist