2012-02-14 58 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

相关问题