我正在尝试编写一个正则表达式,将所有大写单词转换为小写,同时排除转换后的大写罗马数字。
我找到的唯一方法是将所有大写单词(后跟空格,逗号或句点)以及带连字符的单词转换为小写。然后将所有罗马数字转换回大写。
我用它来转换为小写:
(\u+[ ,.-])
然后我必须通过找到并替换所有可疑的罗马数字。
有什么更好的方法可以做到这一点?我尝试了没有运气的负面前瞻表达,但我写作时并不是很强。
我正在测试的样本是美国宪法。以下是输入的示例:
我们是美国的人,为了形成一个更完美的人 工会,建立正义,确保国内安宁,提供 共同防御,促进普遍福利,并获得祝福 对我们自己和我们后代的自由,做出任命和建立 本宪法适用于美利坚合众国。第一条。
派。 1.此处授予的所有立法权力应归属于美国国会。国家,由参议院和众议院组成。
派。 2.众议院应 由所有人每两年选出的成员组成 若干国家和每个国家的选民都应拥有 最多分支的选民必备的资格 州立法机关。任何人不得作为代表 没有达到二十五岁,已经七岁 年是美国公民,当选时不应该 是该州的居民,他将被选中。
第四条。
第五条。
第VI条。
答案 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中的一个总是空的。