2016-01-22 207 views
1

我想用java中的正則表達式替換一些正則表達式,例如用另一個正則表達式替換正則表達式

要求:

輸入:xyxyxyP

所需的輸出:xyzxyzxyzP

意味着我要替換 「(對於)+ \ {」 到「(對於\ {)+ \ {「。有沒有辦法做到這一點?

我曾嘗試下面的代碼

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

但輸出(XYZ)+ P

回答

1

您可以用\G基於正則表達式實現它:

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

看到一個regex demoan IDEONE demo

總之,正則表達式匹配:

  • (?:(?=xy)|(?!^)\\G) - 無論是一個位置,接着用xy(?=xy))或先前成功匹配((?!^)\\G
  • xy後的位置 - 的文字字符xy序列但只有後面跟着...
  • (?=(?:xy)*P) - 零個或多個序列的xy(歸因於(?:xy)*)後跟一個P
+0

可以請您分享從「xyabxyP」獲取「xyzabzxyzP」的regx嗎? –

+0

不知道該模式可以。試試'.replaceAll(「xy |(?!P)[^ x] *(?: x(?!y)[^ x] *)*(?=。* P)」,「$ 0z」)''。 –