我试图在文件中替换一个词,只要它出现在字符串中,除非它包含在字符串中:
所以我应该把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 ")
但也不管用。
2条答案
按热度按时间des4xlb01#
这似乎是可行的(就我从提供的示例中理解了您的要求):
http://rubular.com/r/jZvR4XEbRf
你可能需要调整java的转义。
这其实更好一点:
wgeznvg72#
唯一可靠的方法是搜索完整的引用序列或搜索词。您可以使用一个正则表达式执行此操作,并在每次匹配之后确定匹配的是哪一个。如果是搜索词,则替换它;否则你就别管了
这意味着你不能使用
replaceAll()
。相反,您必须像replaceAll()
本身一样使用appendReplacement()
和appendTail()
方法。下面是一个例子:输出:
我假设每个引号都是有意义的,它们不能被转义--换句话说,您使用的是散文,而不是源代码。转义引号可以处理,但它会使正则表达式变得非常复杂。
如果你真的必须使用
replaceAll()
,有一个技巧,你可以使用lookahead来Assert匹配后面是偶数个引号。但它真的很难看,对于大文本,你可能会发现它的价格昂贵,性能明智。