Java正则表达式的行为不符合逻辑。替换文本中的单词

Java正则表达式的行为不符合逻辑。替换文本中的单词,java,regex,replace,Java,Regex,Replace,我不明白,为什么这个正则表达式不能代替“dürfen”。。。 我有一个输入文本,需要替换很多填充词。但是,由于某种原因,有些人被忽视了。这和空间有关,但我不明白 String input = "melanie rugullies eching trägt dirndl darüber das volksfestmadl stadt freising dürfen begeistern für tanzsport "; //does not work input = inp

我不明白,为什么这个正则表达式不能代替“dürfen”。。。 我有一个输入文本,需要替换很多填充词。但是,由于某种原因,有些人被忽视了。这和空间有关,但我不明白

    String input = "melanie rugullies eching trägt dirndl darüber das volksfestmadl stadt freising dürfen begeistern für tanzsport ";
    //does not work
    input = input.replaceAll("( dürfen )", " ");
    input = input.replaceAll("(\\sdürfen\\s)", " ");
    input = input.replace(" dürfen ", " ");

    //works ...
    input = input.replaceAll("(\\sdarüber\\s)", " ");
    input = input.replaceAll("(\\smöchte\\s)", " ");
    //input = input.replace(" dürfen", " "); //works but is not desired ...
    System.out.println(input);
输出

梅勒妮·鲁格里斯是大众节的主持人 弗雷辛·杜尔芬·贝格斯特恩·弗尔·坦斯波特


预计“杜尔芬”不是输出的一部分。。但事实的确如此!另一方面,“darüber”消失了…

这在python中工作

# coding: utf-8

import re
s = "melanie rugullies eching trägt dirndl darüber das volksfestmadl stadt freising dürfen begeistern für tanzsport "
print(re.sub(' dürfen ','',s))
# melanie rugullies eching trägt dirndl darüber das volksfestmadl stadt freisingbegeistern für tanzsport 

尝试只替换
“dürfen”
,而不是
“(dürfen)”
“(\\sdürfen\\s)”

您的问题是正则表达式在搜索词的两侧都包含空格。在正则表达式引擎替换了单词
“dürfen”
的一个实例之后,它在左侧和右侧都没有为单词留出空间。因此,下一个单词替换失败(因为单词前面没有空格)

您可以使用lookahead regex修复此问题:

String input = "melanie rugullies eching trägt dirndl darüber das volksfestmadl stadt freising dürfen begeistern für tanzsport ";
input = input.replaceAll("\\s+(dürfen|darüber|möchte)(?=\\s)", "");
System.out.println( input );
//=> melanie rugullies eching trägt dirndl das volksfestmadl stadt freising begeistern für tanzsport

没有问题,代码运行良好


包com.stackoverflow

公共类主类{

public static void main(String[] args) {
    // TODO Auto-generated method stub
    String input = "melanie rugullies eching trägt dirndl darüber das volksfestmadl stadt freising dürfen begeistern für tanzsport ";
    //does not work
    input = input.replaceAll("( dürfen )", " ");
    input = input.replaceAll("(\\sdürfen\\s)", " ");
    input = input.replace(" dürfen ", " ");

    //works ...
    //input = input.replaceAll("(\\sdarüber\\s)", " ");
    //input = input.replaceAll("(\\smöchte\\s)", " ");
    //input = input.replace(" dürfen", " "); //works but is not desired ...
    System.out.println(input);

}
}


输出

melanie rugullies eching trägt dirndl darüber das volksfestmadl stadt freising begeister für tanzsport

此代码有效(大写字母没有问题),其正则表达式以正确的间距保留字符串:

input = input.replaceAll("\\W*\\bdürfen\\b\\W*", " ").trim();

这个正则表达式的一个小区别是,它使用任意一侧的任何非单词字符(即连字符等,而不仅仅是空格)并放入空格。然后对该结果进行修剪,以处理在输入开始/结束时发生的替换边缘情况。

使用
\b
检查工作边界。没有乌姆劳特的作品;你能在没有它们的情况下尝试你的代码吗?可能是一种编码方式。FWIW,你的代码取代了“dürfen”,正如你在my中所期望的那样。谢谢@J0e3gan,那么无论什么原因,这只在我的pc/java版本上才是真正的错误。就像我说的。。。这真的没有道理。谢谢你。。。边界\b比\s工作得更好。。。但是我不明白为什么大多数单词都有用,但有些不…@Umingo你的“不起作用”的例子对我有用。检查编辑器的编码。或者,使用UTF格式对您的文本进行编码,例如
u
is
\u00fc
thx@Bogemian,但奇怪的是,除了UTF-8之外没有其他格式。我正在使用netbeans,netbeans拒绝使用非utf-8编码的文件。您可能有来自另一个字符集的字符,这些字符看起来相同,但有所不同。请打印出每个字符的十进制值:
System.out.println((int)str.charAt(I))并比较