grep大写单词为小写,但不包括罗马数字

时间:2012-02-14 02:35:47

标签: regex adobe-indesign grep-indesign

我正在尝试编写一个正则表达式,将所有大写单词转换为小写,同时排除转换后的大写罗马数字。

我找到的唯一方法是将所有大写单词(后跟空格,逗号或句点)以及带连字符的单词转换为小写。然后将所有罗马数字转换回大写。

我用它来转换为小写:

(\u+[ ,.-])

然后我必须通过找到并替换所有可疑的罗马数字。

有什么更好的方法可以做到这一点?我尝试了没有运气的负面前瞻表达,但我写作时并不是很强。

我正在测试的样本是美国宪法。以下是输入的示例:

  我们是美国的人,为了形成一个更完美的人   工会,建立正义,确保国内安宁,提供   共同防御,促进普遍福利,并获得祝福   对我们自己和我们后代的自由,做出任命和建立   本宪法适用于美利坚合众国。

     

第一条。

     

派。 1.此处授予的所有立法权力应归属于美国国会。国家,由参议院和众议院组成。

     

派。 2.众议院应   由所有人每两年选出的成员组成   若干国家和每个国家的选民都应拥有   最多分支的选民必备的资格   州立法机关。任何人不得作为代表   没有达到二十五岁,已经七岁   年是美国公民,当选时不应该   是该州的居民,他将被选中。

     

第四条。

     

第五条。

     

第VI条。

1 个答案:

答案 0 :(得分:3)

如果正则表达式支持负面预测,您可以尝试:

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

表示“任何完整的大写单词并非完全由L,X,I,V,C,D,M组成”(罗马数字)。

它还可以方便地阻止单词“I”被转换。 (顺便说一句,如果你想阻止转换一个字母的大写单词,请使用[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中的一个总是空的。