如何在java中使用正则表达式非捕获组进行字符串替换

时间:2015-05-15 13:20:12

标签: java regex automation

我要求在新版本上更改AssemblyVersion。我使用java代码string.replaceAll(regexPattern,updatedString);

来做

此代码适用于普通正则表达式模式,但我无法在此模式中使用非捕获组。我想使用非捕获组来确保我不会捕获非必需的模式。这是我试过的代码:

String str="[assembly: AssemblyVersion(\"1.0.0.0\")]";
str=str.replaceAll("(?:\\[assembly: AssemblyVersion\\(\"\\d\\.\\d\\.)?.*(?:\"\\)\\])?", "4.0");
System.out.println(str);

在这里,我想匹配字符串[assembly: AssemblyVersion(int.int)]并仅替换次要版本。

预期结果为[assembly: AssemblyVersion("1.0.4.0")],但我的结果为4.04.0

有人可以帮我吗?

3 个答案:

答案 0 :(得分:6)

为什么不使用looka-head / look-behind呢?

它们是非捕获的,可以在这里轻松工作:

str = str
    .replaceAll(
        "(?<=\\[assembly: AssemblyVersion\\(\"\\d\\.\\d\\.).*(?=\"\\)\\])",      
        "4.0"
    );

答案 1 :(得分:1)

作为后视的替代方案,您可以围绕要保留的内容使用捕获组,并在非捕获组中保留要替换的内容,或者根本不保留任何组:

String str="[assembly: AssemblyVersion(\"1.0.0.0\")]";
str=str.replaceAll("(\\[assembly:\\s*AssemblyVersion\\(\"\\d+\\.\\d+\\.)\\d+\\.\\d+(?=\"\\)\\])", "$014.0");
System.out.println(str);

请参阅IDEONE demo

答案 2 :(得分:0)

这适用于您的情况:

str.replaceAll("(\\[assembly: AssemblyVersion\\(\"\\d\\.\\d\\.)(\\d\\.\\d)(\"\\)\\])", "$14.0$3");