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

Pra*_*gam 4 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);
Run Code Online (Sandbox Code Playgroud)

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

预期的结果是[assembly: AssemblyVersion("1.0.4.0")],但我得到了结果4.04.0.

有人可以帮我这个吗?

Men*_*ena 7

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

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

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

  • 之所以可行,而您的示例却没有,是因为您的调用String.replaceAll()没有使用捕获组。`replaceAll()`所做的是**匹配正则表达式的所有内容**并将其替换为替换值。Look-(ahead / behind)会做您想要的事情,因为它们是“零长度”断言:如果后面有alook-ahead,则regex仅与您的字符串匹配,但是模式的那些部分不会“计数” ”作为匹配字符串的一部分,因此它们不会被替换。 (2认同)