在Java Regex中匹配A而不是B?

时间:2016-06-23 11:11:16

标签: java regex match

我有一份大文件。让我们把它缩放到

location=State-City-House
location=City-House

所以我想做的是用一些其他字符串替换所有那些不以State开头的东西。说“纽约”。但那些从国家开始的人必须保持不变。

所以我的最终结果将是

location=State-City-House
location=NY-City-House

1.显然我不能使用String.replaceAll()。

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

3.用一种肮脏的方式首先用“bocation = State”替换“location = State”然后替换其他的然后重新替换。

那么,一个简洁明了的方法呢?

2 个答案:

答案 0 :(得分:3)

你绝对可以使用replaceAll作为否定前瞻:

String repl = input.replaceAll( "(?m)^(location=)(?!State)", "$1NY-" );
  • (?m)设置MULTILINE修饰符,以便我们匹配每行中的锚点^$
  • (location=)匹配location=并捕获组#1
  • 中的值
  • (?!State)是在捕获的组#1即State
  • 之后出现location=时未通过匹配的否定前瞻
  • 我们在替换时使用$1NY-将其设为location=NY-

RegEx Demo

答案 1 :(得分:0)

如果我理解你的意图,你实际上并没有字符串" State"在您的输入中,但代表状态的变化字符串。 但是你的一些文本行完全错过了州,只有城市和众议院的名字。那是对的吗?在这种情况下,两种线之间的定义特征是破折号。

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

上述正则表达式仅匹配仅有1个短划线的完整行。

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