用于替换java中字符的多个正则表达式
我有以下字符串:用于替换java中字符的多个正则表达式,java,regex,replaceall,Java,Regex,Replaceall,我有以下字符串: 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、ST
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
实际结果:
Klasse、STRAssE、FUSS
我错在哪里?使用String.replaceFirst()而不是String.replaceAll()。
这将替换所有出现的“ß”。因此,此语句后的输出如下所示: 克拉斯,斯特拉斯,小题大做 现在
replaceAll(“A-Z | ss$”,“ss”)
将最后出现的“ss”替换为“ss”,因此最终结果如下所示:
克拉斯,斯特拉斯,小题大做
要获得您的预期结果请尝试以下方法:
String replaceUml = str.replaceFirst("ß", "ss").replaceAll("ß", "SS");
将正则表达式分解为多个部分: Regex
/ß/g
/([A-Z])ss$/g
/([A-Z]+)ss([A-Z]+)/g
说明
可视化
Regex
/ß/g
/([A-Z])ss$/g
/([A-Z]+)ss([A-Z]+)/g
说明
可视化
Regex
/ß/g
/([A-Z])ss$/g
/([A-Z]+)ss([A-Z]+)/g
说明
可视化
专门为你 as
ß
不会在开始时出现
您的主要问题是没有使用括号
[A-Z]
首先,如果要匹配A-Z范围内的某个字符,需要将其放在方括号中。这个
.replaceAll("A-Z|ss$", "SS")
将在源代码中查找三个字符A-Z,这不是您想要的。第二,我认为你对|的含义感到困惑。如果你这样说:
.replaceAll("[A-Z]|ss$", "SS")
它将用SS替换单词末尾的任何大写字母,因为|表示查找这个或那个
您的方法的第三个问题是,第二个和第三个replaceAll将查找原始字符串中的任何ss,即使它不是来自Aß。这可能不是你想要的
下面是我要做的:
String replaceUml = str
.replaceAll("(?<=[A-Z])ß", "SS")
.replaceAll("ß", "ss");
String replaceUml=str
.replaceAll((?我不知道你认为你的表达方式是什么。第一个将ß替换为ss
,第二个将ss
放在一个单词的末尾(或字符串a-Z
),并将其替换为ss
(这就是FUSS
的正确方式),但我不知道你认为第三个应该做什么……你能澄清一下吗?@Floris第三个应该找到以大写字母开头,以大写字母结尾,中间有ss
的字符串。如果所有提到的表达式都是真的,那么如果我理解你的意思,那么将ss
替换为ss
如果字符串只包含小写字符,则尝试使用smallss
替换;如果字符串都是大写字符,则尝试使用supperss
替换;如果字符串都是大写字符,则尝试使用smallss
替换。第三个替换我仍然无法理解您试图实现的目标,并且您可能将字符类范围与文字字符匹配混淆。Wi根据您的建议,我现在有以下结果:Klasse、STRAssE、FUss
尝试使用replaceFirst()。这将有帮助。:-)按照你的答案我们得到了结果:Klasse,STRAssE,FUSS
,但是我想Klasse,STRAssE,FUSS
看到我答案的最后一部分。我已经粘贴了代码以获得你预期的结果。希望这会有所帮助。嗯,这不是要删除ss之前的角色吗?是的,如果你点击我使用的链接,捕获组没有在解决方案编辑的代码中,您需要将反斜杠\1和\2加倍,这是java,而不是JavaScriptYes,我之前没有提到这一点。(另外,它不是Perl。)它应该是$1
和$2
\\1
和\\2
不起作用。+1但我认为你也需要向前看,如果是aßbc
你想要的Assbc
(不知道德语单词是否与ß第二个字母一起存在,但从模式的角度看,这是一个边缘大小写)是的,我和你在同一时间也在考虑这个问题。我怀疑在ß后面跟“t”或“p”的地方确实存在这样的词“,但我记不清了,为了让事情变得有趣,德国政府最近修改了关于何时应该使用ß的规定,所以我在高中德语中学到的东西现在都错了。
String replaceUml = str
.replaceAll("(?<=[A-Z])ß", "SS")
.replaceAll("ß", "ss");
String replaceUml = str
.replaceAll("(?<=[A-ZÄÖÜ])ß", "SS")
.replaceAll("ß", "ss");
String replaceUml = str
.replaceAll("(?<=\\p{Lu})ß", "SS")
.replaceAll("ß", "ss");
String replaceUml = str
.replaceAll("(?<=\\b\\p{Lu})ß(?=\\P{Lu})", "ss")
.replaceAll("(?<=\\p{Lu})ß", "SS")
.replaceAll("ß", "ss");