我真的需要一些帮助在java中形成一个正则表达式模式。
我试图替换给定单词的所有出现,前提是它没有包含在小于或大于符号内。即使较小/大于标志不直接在单词旁边,也不应该替换它。这是我最近的尝试:
stringIn = stringIn.replaceAll("((?:<[^>]>[^<]*)+" + word + "(?:<[^>]>[^<]*)+)", "$1<" + newWord + ">$2");
但这似乎并没有取代括号内的单词。 只是为了澄清我做了一个替代示例:
"foo word <word> <foo word foo>" should go to
"foo <newWord> <word> <foo word foo>
PS刚看到 this SO question 它看起来很相似,但我并不理解它,也不能保证它,因为它指的是PHP而不是Java。
答案 0 :(得分:1)
我会使用正则表达式
word(?=[^>]*(?:$|<))
以下说明中{}
中包含的项目显示前一个词组解释了正则表达式的哪一部分:正则表达式查找单词{word
} that is followed by {(?=...)
} {{3 } a sequence of zero or more后面紧跟着characters {[...]*
} that does not include the character >
{^>
} end of the string {$
}字符<
{<
}。
您可以在此处找到演示和其他说明:or {(?:...|...)
}
在Java中实现,它看起来像这样:
stringIn = stringIn.replaceAll(word + "(?=[^>]*(?:$|<))", "<" + newWord + ">");
注意:这假定所有<...>
都是平衡的,即对于每个<
,只有一个且只有一个对应>
,并且对于每个>
是唯一一个对应的<
。
答案 1 :(得分:0)
以下是适合您的代码:
String newWord = "-REPLACED-";
Pattern p = Pattern.compile( "(<[^>]*>)|(\\bword\\b)" );
Matcher m = p.matcher( "foo word <word> <foo word foo> word" );
StringBuffer sb = new StringBuffer();
while (m.find()) {
if (m.groupCount()>1 && m.group(2) != null)
m.appendReplacement(sb, "<" + newWord + ">");
}
m.appendTail(sb);
System.out.println( sb );
foo <-REPLACED-> <word> <foo word foo> <-REPLACED->
答案 2 :(得分:-1)
您可以使用以下内容:
String val="<blablabla word blablabla> word123 <word>";
String REGEX="(?<=>)[^<]+";
String replaceString="replace";
System.out.println(val.replaceAll(REGEX, replaceString));
输出
<blablabla word blablabla>replace<word>
<强> Refer 强>