使用正则表达式替换未包含在<>中的单词迹象

时间:2014-01-20 13:50:42

标签: java regex

我真的需要一些帮助在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。

3 个答案:

答案 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