Java正则表达式的行为不符合逻辑。替换文本中的单词
我不明白,为什么这个正则表达式不能代替“dürfen”。。。 我有一个输入文本,需要替换很多填充词。但是,由于某种原因,有些人被忽视了。这和空间有关,但我不明白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
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))编码>并比较