3

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

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

我用它来转换为小写:

(\u+[ ,.-])

然后我不得不去寻找并替换所有可疑的罗马数字。

有什么更好的方法来做到这一点?我尝试了没有运气的否定前瞻表达式,但我写它们的能力不是很强。

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

我们,美国人民,为了建立更完美的联盟,建立正义,确保国内安宁,提供共同防御,促进普遍福利,并确保我们自己和我们的子孙后代获得自由的祝福,请并为美利坚合众国制定本宪法。

第一条。

教派。1. 此处授予的所有立法权应授予美国国会,该国会应由参议院和众议院组成。

教派。2. 众议院由每两年由各州全体人民选出的议员组成,各州的选举人应具备州议会最多分部选举人所需的资格。No person shall be a Representative who shall not have attained to the age of twenty-five years, and been seven years a citizen of the United States, and who shall not, when elected, be an inhabitant of that State in which he shall be选择。

第四条。

第五条。

第六条。

4

1 回答 1

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 美元中的一个总是空的。

于 2012-02-14T03:06:06.180 回答