2012-02-14 65 views
3

我想寫一個正則表達式將所有大寫單詞轉換爲小寫,同時排除大寫羅馬數字轉換。grep大寫單詞到小寫,而不包括羅馬數字

我發現的唯一方法是將所有大寫單詞後跟空格,逗號或句點以及連字符轉換爲小寫。然後將所有羅馬數字轉換爲大寫。

我用這個要轉換爲小寫:

(\u+[ ,.-]) 

然後我不得不通過查找和替換所有可疑的羅馬數字。

什麼是更好的方法來做到這一點?我嘗試了沒有運氣的負面預測表達式,但我在寫作時並不強大。

我正在測試的樣本是美國憲法。這裏的輸入樣本:

WE,美國人民,爲了形成更加完善的 結合,樹立正義,保障國內的安寧,爲 共同的國防,增進全民福利併爲自己和我們的後代確保自由的祝福 ,併爲本美利堅合衆國制定本憲法並制定 。

第I條。

Sect。 1.在此授予的所有立法權力應由聯合國大會組成,該大會由參議院和衆議院組成。

Sect。 2.衆議院 由 幾個國家的所有人每兩年選出的成員組成,每個州的選民必須具有 國家立法機構最多的分支的選舉人所需的資格 。任何人不得成爲代表,其不應當是未滿25歲,並且已有7年 年的美國公民,並且當選時 不應當是該州的居民他將被選中。第二部分:第一部分第二部分第三部分第四部分第四部分

第五條。

第六條。

+1

問題 - 正則表達式支持lookaround,特別是負向lookahead嗎? – 2012-02-14 02:48:29

+0

@ mathematical.coffee這適用於已記錄[支持]的InDesign CS5.5(http://help.adobe.com/en_US/indesign/cs/using/WS1952D538-1335-4b1d-BA5E-FA5A176FDC9Fa.html )在正則表達式引擎中。 – jeffrbauer 2012-02-14 02:55:32

回答

2

如果正則表達式的味道支持負向前看符號,你可以嘗試:

\b(?![LXIVCDM]+\b)([A-Z]+)\b 

它說「這並非完全由L-任何全大寫的話,X,I,V,C ,D,M「(羅馬數字)。

它還方便地停止單詞「我」被轉換。 (另外,如果您想防止單字母大寫單詞被轉換,請使用[A-Z]{2,} - 這會阻止大寫字母「A」(在句子的開頭)並轉換,您通常希望停留在正常情況下)。它可以阻止完全由這些字母組成的匹配詞 - 但我能想到的只有「DID」,也許是「DIV」(如在HTML中),「DIM」(如在維度中), 「MID」,「MIDI」,「VIC」(如在維多利亞?)...

雖然,你當然可以改變羅馬數字正則表達式來更加體貼一些規則,例如

(?=[MDCLXVI])M{0,3}(C[DM]|DC{0,3}|C{1,3})?(X[LC]|LX{0,3}|X{1,3})?(I[XV]|VI{0,3}|I{1,3})? 

說明:

(?=[MDCLXVI])   # make sure we match at least something 
         # (since everything in this regex is optional) 
M{0,3}     # Can have 0 to 3 Ms, being thousands 
(C[DM]|DC{0,3}|C{1,3})? # for the hundreds column can have CD, CM, 
         # C, CC, CCC, D, DC, DCC, DCCC 
(X[LC]|LX{0,3}|X{1,3})? # for the tens column can have XL, XC, 
         # L, LX, LXX, LXXX, X, XX, XXX 
(I[XV]|VI{0,3}|I{1,3})? # for the ones column can have IX, IV, 
         # V, VI, VII, VIII, I, II, III. 

認爲,涵蓋所有可能的羅馬數字....

如果您正則表達式的味道支持負向前看符號,也許你可以做類似:

\b((ROMAN_NUMERAL_REGEX)|([A-Z]+))\b 

並替換爲「$ 2 $ 3_converted_to_lower_case」(對不起 - 我不知道如何進行實際的轉換)。

上面將工作,因爲該正則表達式只有永遠匹配的羅馬數字的正則表達式(和被捕獲在$ 2),其它正則表達式(捕獲在$ 3)。所以2美元或3美元中的一個總是空的。

+0

感謝您構建所有這些表達式。他們工作得很好,我很欣賞你花時間寫的大量細節。我期待從他們那裏學到更多。 – jeffrbauer 2012-02-14 03:26:00

相關問題