匹配Java正则表达式中的A而不是B?

匹配Java正则表达式中的A而不是B?,java,regex,match,Java,Regex,Match,我有一份大文件。让我们把它扩展到 location=State-City-House location=City-House 所以我要做的是用其他字符串替换所有不以State开头的字符串。说“NY”。但那些以国家为起点的国家必须保持不变 所以我的最终结果是 location=State-City-House location=NY-City-House 1.显然我不能使用String.replaceAll() 2.使用Pattern.matcher()很棘手,因为我们使用两种不同的模式,其中

我有一份大文件。让我们把它扩展到

location=State-City-House
location=City-House
所以我要做的是用其他字符串替换所有不以State开头的字符串。说“NY”。但那些以国家为起点的国家必须保持不变

所以我的最终结果是

location=State-City-House
location=NY-City-House
1.显然我不能使用String.replaceAll()

2.使用Pattern.matcher()很棘手,因为我们使用两种不同的模式,其中一种必须找到,另一种不能找到

3.尝试了一种肮脏的方法,先用“位置=状态”替换“位置=状态”,然后替换其他位置,然后重新替换


那么,一个简洁的方法是什么呢?

你可以肯定地使用
replaceAll
进行消极的前瞻:

String repl = input.replaceAll( "(?m)^(location=)(?!State)", "$1NY-" );
  • (?m)
    设置
    多行
    修改器,以便我们在每行中匹配锚定
    ^
    $
  • (location=)
    匹配
    location=
    并捕获组#1中的值
  • (?!State)
    是在捕获的组#1之后出现
    状态
    ,即
    位置=
  • 作为替代,我们在开始时使用
    $1NY-
    将其设置为
    location=NY-

如果我正确理解您的意图,您的输入中实际上没有字符串“State”,而是表示状态的不同字符串。 但是你的一些文本行完全没有州,只有城市和房子的名字。对吗?在这种情况下,两种线之间的定义特征是虚线数

^location=([^-]+)-([^-]+)$

上面的正则表达式只匹配带1个破折号的完整行


我可能误解了这项任务。如果您可以发布一些实际输入,这会更容易。

为什么不能使用
replaceAll
replaceFirst
?看见是否需要用相同的
NY-
值替换所有匹配项?提示:有时正则表达式是一个很好的答案;有时它们不是。请记住随着时间的推移维护复杂正则表达式的成本。每个java程序员都理解
如果(匹配regexA){…做一件事}否则{…做另一件事}
。例如,有多少java程序员会立即理解anubhava提供的解决方案?(并不是说他的解决方案是错误的;但是:如果你需要一位正则表达式大师来提出解决方案;你明天改变/增强正则表达式的可能性有多大;离线,没有访问SO正则表达式大师)?@Jägermeister:你不必是一位大师来了解周围的情况。如果有人要求使用正则表达式解决方案,他必须了解基本知识。而且,
(?m)^(location=)(!State)
不是一个困难的模式。阿努巴瓦只是不总是解释他的建议,这是唯一的缺点。