Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于替换java中字符的多个正则表达式_Java_Regex_Replaceall - Fatal编程技术网

用于替换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ß";
使用组合正则表达式我想分别替换德语ßssss的字母。为此,我必须:

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
如果字符串只包含小写字符,则尝试使用small
ss
替换;如果字符串都是大写字符,则尝试使用supper
ss
替换;如果字符串都是大写字符,则尝试使用small
ss
替换。第三个替换我仍然无法理解您试图实现的目标,并且您可能将字符类范围与文字字符匹配混淆。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");