我有以下字符串:
String str = "Klaße, STRAßE, FUß";
使用组合正则表达式 我想分别将德语ß 字母替换为ss 或SS。为了执行此操作,我有:
String replaceUml = str
.replaceAll("ß", "ss")
.replaceAll("A-Z|ss$", "SS")
.replaceAll("^(?=^A-Z)(?=.*A-Z$)(?=.*ss).*$", "SS");
预期结果:
Klasse、STRASSE、FUSS
实际结果:
类、STRAsE、FUSS
我哪里错了?
最佳答案
首先,如果您要匹配 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");
问题是如果 ß 是文本中的 second 字符,并且单词的第一个字母大写但单词的其余部分不是大写,则它将不起作用。在那种情况下,您可能需要小写的“ss”。
String replaceUml = str
.replaceAll("(?<=\\b\\p{Lu})ß(?=\\P{Lu})", "ss")
.replaceAll("(?<=\\p{Lu})ß", "SS")
.replaceAll("ß", "ss");
现在第一个将用 ss 替换 ß,如果它前面有一个大写字母,该字母是单词的第一个字母,但后跟一个不是大写字母的字符。大写 P 的 \P{Lu}
将匹配除大写字母以外的任何字符(它是 \p{Lu}
小写字母的负数)情况 p)。我还包括\b 来测试单词的第一个字符。
关于java - 用于替换 java 中字符的多个正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18338923/