首先,如果你想匹配 A-Z 范围内的某个字符,你需要将它放在方括号中。这个
.replaceAll("A-Z|ss$", "SS")
将在源代码中查找A-Z三个字符,这并不是您想要的。其次,我认为您对符号|的含义感到困惑。如果您这样说:
.replaceAll("[A-Z]|ss$", "SS")
它将用SS替换单词末尾的任何大写字母,因为|表示查找这个或那个。
你的方法存在第三个问题,即第二和第三个replaceAll将查找原始字符串中的任何ss,即使它不是来自ß。这可能是你想要的,也可能不是。
这是我会做的:
String replaceUml = str
.replaceAll("(?<=[A-Z])ß", "SS")
.replaceAll("ß", "ss");
如果ß前面的字符是大写字母,则首先将所有的ß替换为SS;然后,如果还有任何ß剩余,则将其替换为ss。实际上,如果ß之前的字符是像Ä这样的变音符号,则此方法不起作用,因此您可能需要更改此方法:
String replaceUml = str
.replaceAll("(?<=[A-ZÄÖÜ])ß", "SS")
.replaceAll("ß", "ss");
(可能有更好的方式来指定“大写Unicode字母”; 我会寻找它。)
编辑:
String replaceUml = str
.replaceAll("(?<=\\p{Lu})ß", "SS")
.replaceAll("ß", "ss");
一个问题是,如果ß是文本中的第二个字符,并且单词的第一个字母大写,但单词的其余部分不是大写的,则它将无法工作。在这种情况下,您可能希望使用小写的“ss”。
String replaceUml = str
.replaceAll("(?<=\\b\\p{Lu})ß(?=\\P{Lu})", "ss")
.replaceAll("(?<=\\p{Lu})ß", "SS")
.replaceAll("ß", "ss");
现在,第一条规则将在 ß 前面是大写字母并且后面不是大写字母的情况下将其替换为 ss。 使用大写字母 P 的 \P{Lu}
将匹配除大写字母外的任何字符(它是小写字母 p 的反义词 \p{Lu}
)。 我们还包括了 \b 来测试单词的第一个字符。
ss
,第二个接受单词末尾的ss
(或字符串A-Z
)并将其替换为SS
(这就是为什么FUSS
是正确的),但我无法弄清楚你认为第三个应该做什么... 你能澄清一下吗? - Florisss
替换字符串,如果该字符串仅包含小写字符,则使用大写的SS
进行替换。第三个替换我仍然无法弄清楚你想要实现什么,你可能将字符类范围与字面字符匹配混淆了。 - Ibrahim Najjar