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 处发生的替换的边缘情况。
我不明白,为什么这个正则表达式不替换 "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 处发生的替换的边缘情况。