java - 用于替换 java 中字符的多个正则表达式

标签 java regex replaceall

我有以下字符串:

String str = "Klaße, STRAßE, FUß";

使用组合正则表达式 我想分别将德语ß 字母替换为ssSS。为了执行此操作,我有:

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/

相关文章:

java jlist - AbstractListModel - fireContentsChanged 无法正常工作

java - 如何确定android中输入设备的来源是什么?

java - 带括号和空格的掩码电话号码 Java

Java replaceAll ("\\s+") 与 replaceAll ("\\\\s+")

PHP 正则表达式 - 1 个或多个整数的值

java - 是否有与Java的replaceAll ("\\p{Cntrl}"、 "")等效的Objective-C(NSString)?

java - Spring 启动 : Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean

java - 获取线路的特定部分

javascript - 如何使用 javascript 通过不区分大小写的搜索从 JSON 返回结果?

Python 正则表达式电子邮件地址