regex 替换字符串中没有的单词

q43xntqr  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(148)

我试图在文件中替换一个词,只要它出现在字符串中,除非它包含在字符串中:
所以我应该把this替换成

The test in this line consists in ...

但不应匹配:

The test "in this line" consist in ...

这就是我在尝试的:

line.replaceAll( "\\s+this\\s+", " that ")

但它在这个场景中失败了,所以我尝试使用:

line.replaceAll( "[^\"]\\s+this\\s+", " that ")

但也不管用。

des4xlb0

des4xlb01#

这似乎是可行的(就我从提供的示例中理解了您的要求):

(?!.*\s+this\s+.*\")\s+this\s+

http://rubular.com/r/jZvR4XEbRf
你可能需要调整java的转义。
这其实更好一点:

(?!\".*\s+this\s+)(?!\s+this\s+.*\")\s+this\s+
wgeznvg7

wgeznvg72#

唯一可靠的方法是搜索完整的引用序列或搜索词。您可以使用一个正则表达式执行此操作,并在每次匹配之后确定匹配的是哪一个。如果是搜索词,则替换它;否则你就别管了
这意味着你不能使用replaceAll()。相反,您必须像replaceAll()本身一样使用appendReplacement()appendTail()方法。下面是一个例子:

String s = "Replace this example. Don't replace \"this example.\" Replace this example.";
System.out.println(s);

Pattern p = Pattern.compile("\"[^\"]*\"|(\\bexample\\b)");
Matcher m = p.matcher(s);
StringBuffer sb = new StringBuffer();

while (m.find())
{
  if (m.start(1) != -1)
  {
    m.appendReplacement(sb, "REPLACE");
  }
}
m.appendTail(sb);
System.out.println(sb.toString());

输出:

Replace this example. Don't replace "this example." Replace this example.
Replace this REPLACE. Don't replace "this example." Replace this REPLACE.

我假设每个引号都是有意义的,它们不能被转义--换句话说,您使用的是散文,而不是源代码。转义引号可以处理,但它会使正则表达式变得非常复杂。
如果你真的必须使用replaceAll(),有一个技巧,你可以使用lookahead来Assert匹配后面是偶数个引号。但它真的很难看,对于大文本,你可能会发现它的价格昂贵,性能明智。

相关问题