Monti Chandra
Monti Chandra

Reputation: 442

Replace a regular expression with another regex

I want to replace some regex with regex in java for e.g.

Requirement:

Input: xyxyxyP

Required Output : xyzxyzxyzP

means I want to replace "(for)+\{" to "(for\{)+\{" . Is there any way to do this?

I have tried the following code

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class ReplaceDemo2 {

    private static String REGEX = "(xy)+P";
    private static String INPUT = "xyxyxyP";
    private static String REGEXREPLACE = "(xyz)+P";

    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        // get a matcher object
        Matcher m = p.matcher(INPUT);
        INPUT = m.replaceAll(REGEXREPLACE);
        System.out.println(INPUT);
    }
}

but the output is (xyz)+P .

Upvotes: 3

Views: 3024

Answers (1)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626748

You can achieve it with a \G based regex:

String s = "xyxyxyP";
String pattern = "(?:(?=xy)|(?!^)\\G)xy(?=(?:xy)*P)";
System.out.println(s.replaceAll(pattern, "$0z")); 

See a regex demo and an IDEONE demo.

In short, the regex matches:

  • (?:(?=xy)|(?!^)\\G) - either a location followed with xy ((?=xy)) or the location after the previous successful match ((?!^)\\G)
  • xy - a sequence of literal characters xy but only if followed with...
  • (?=(?:xy)*P) - zero or more sequences of xy (due to (?:xy)*) followed with a P.

Upvotes: 3

Related Questions