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

Java Regex behaves not logical. replace words within text

我不明白,为什么这个正则表达式不替换 "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);

输出

melanie rugullies eching trägt dirndl das volksfestmadl stadt freising dürfen begeistern für tanzsport

预计 "dürfen" 不是输出的一部分..但它是!另一方面 "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)".

你的问题是你的正则表达式在搜索词的两边都包含 space。在正则表达式引擎替换单词 " dürfen " 的一个实例后,它不会为左右两侧的单词留下任何 space。因此下一个单词替换失败(由于单词前 spaces 不可用)。

您可以使用先行正则表达式来解决此问题:

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.Whosebug;

public class 主类 {

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 外搭连衣裙,弗莱辛市的民间节日姑娘热衷跳舞

此代码有效(变音字母没有问题)并且其正则表达式使字符串具有正确的间距:

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

这个正则表达式的一个小区别是它消耗任何非单词字符(即连字符等,而不仅仅是白色space)并放入space。然后修剪该结果以处理在输入的 start/end 处发生的替换的边缘情况。