performanceuser
performanceuser

Reputation: 2893

java regex how to match some string that is not some substring

For example, my org string is:

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

I want everything that does not equal to "CCC=123" to be changed to "CCC=AAA"

So the result is:

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

How to do it in regex?

If I want everything that is equal to "CCC=123" to be changed to "CCC=AAA", it is easy to implement:

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

Upvotes: 0

Views: 934

Answers (2)

Alan Moore
Alan Moore

Reputation: 75232

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

(?m) activates MULTILINE mode, which allows ^ and $ to match the beginning and and end of lines, respectively. The $ in the lookahead makes sure you don't skip something that matches only partially, like CCC=12345. The $ at the very end isn't really necessary, since the .* will consume the rest of the line in any case, but it helps communicate your intent.

Upvotes: 1

Brian Roach
Brian Roach

Reputation: 76908

You can use a negative lookahead:

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);

}

output:

CCC=123 CCC=AAA CCC=AAA

These are zero-width, non capturing, which is why you have to then add the .{3} to capture the non-matching characters to be replaced.

Upvotes: 1

Related Questions