Java Matcher.replaceAll()也匹配group(0)元素

时间:2015-06-15 12:02:01

标签: java regex

我认为这是一个非常常见的问题,但也无法在SO或任何其他教程中找到相关问题。因此,如果它是重复的,请随意标记。

这就是问题所在,我有String,我想将其中的所有字词test替换为tested。但我不想替换<>

中包含的字词。

例如:字符串this test is <other test end>应替换为this tested is <other test end>

所以我创建了一个正则表达式(?:<.*?>)|(test)<>内的任何内容都应该是非捕获组,所有其他test应该匹配。

但据我所知,Matcher.group(0)甚至会匹配非捕获组。更糟糕的是Matcher.replaceAll()似乎也取代了非捕获组文本?

我该如何解决这个问题?我有什么方法可以指定replaceAll()来仅替换group(1)元素吗?

还有其他简单而干净的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:5)

使用否定先行断言。

string.replaceAll("test(?![^<>]*>)", "tested")

<强>解释

  • test - 仅在字符串测试未后跟

  • 时才匹配
  • 任何字符,但不是<>,不论是零还是多次。

  • 接着是> char。因此,这与test

  • 中存在的<>之外的所有$ telnet <hostname> <port> 相匹配