java正则表达式如何匹配一些不是某些子串的字符串

时间:2011-10-08 02:46:28

标签: java regex

例如,我的组织字符串是:

CCC=123
CCC=DDDDD
CCC=EE
CCC=123
CCC=FFFF

我希望所有不等于“CCC = 123”的东西都改为“CCC = AAA”

结果是:

CCC=123
CCC=AAA
CCC=AAA
CCC=123
CCC=AAA

如何在正则表达式中执行此操作?

如果我希望将所有等于“CCC = 123”的内容更改为“CCC = AAA”,则很容易实现:

(AAA [\ t] * =)(123)

2 个答案:

答案 0 :(得分:1)

您可以使用否定前瞻:

public static void main(String[] args) 
{

    String foo = "CCC=123 CCC=DDD CCC=EEE";
    Pattern p = Pattern.compile("(CCC=(?!123).{3})");
    Matcher m = p.matcher(foo);
    String result = m.replaceAll("CCC=AAA");

    System.out.println(result);

}

输出:

  

CCC = 123 CCC = AAA CCC = AAA

这些是零宽度,非捕获,这就是为什么你必须添加.{3}来捕获要替换的不匹配字符的原因。

答案 1 :(得分:1)

s = s.replaceAll("(?m)^CCC=(?!123$).*$", "CCC=AAA");

(?m)激活MULTILINE模式,允许^$分别匹配行的开头和结尾。前瞻中的$可确保您不会跳过仅部分匹配的内容,例如CCC=12345。最后的$并不是必需的,因为.*在任何情况下都会占用该行的其余部分,但它有助于传达您的意图。