如何在java中使用正则表达式非捕获组替换字符串
我需要在新版本上更改如何在java中使用正则表达式非捕获组替换字符串,java,regex,automation,Java,Regex,Automation,我需要在新版本上更改AssemblyVersion。我使用java代码string.replaceAll(regexpatern,updatedString)来实现它 这段代码适用于正常的正则表达式模式,但我无法在此模式中使用非捕获组。我想使用非捕获组来确保不捕获除必需模式以外的其他模式。这是我尝试的代码: String str="[assembly: AssemblyVersion(\"1.0.0.0\")]"; str=str.replaceAll("(?:\\[assembly: Asse
AssemblyVersion
。我使用java代码string.replaceAll(regexpatern,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
有人能帮我一下吗?为什么不改用“向前看/向后看”呢
它们是非捕获的,在这里很容易工作:
str = str
.replaceAll(
"(?<=\\[assembly: AssemblyVersion\\(\"\\d\\.\\d\\.).*(?=\"\\)\\])",
"4.0"
);
str=str
.replaceAll(
(?作为“回头看”的替代方案,您可以围绕要保留的内容使用捕获组,并将要替换的内容保留在非捕获组或根本不保留组中:
String str="[assembly: AssemblyVersion(\"1.0.0.0\")]";
str=str.replaceAll("(\\[assembly:\\s*AssemblyVersion\\(\"\\d+\\.\\d+\\.)\\d+\\.\\d+(?=\"\\)\\])", "$014.0");
System.out.println(str);
请参见这对您的案例有效:
str.replaceAll("(\\[assembly: AssemblyVersion\\(\"\\d\\.\\d\\.)(\\d\\.\\d)(\"\\)\\])", "$14.0$3");
我运行了此程序,但您没有任何组处于该模式。您是否希望使用捕获组?[assembly:AssemblyVersion(“1.0
此我希望作为非捕获组0.0
我希望作为捕获组”)
我希望作为非捕获组。因此,只有bug修复号(第三位)和内部版本号(第四位)被替换,但整个模式用于匹配。之所以有效而您的示例无效,是因为您的调用String.replaceAll()
不使用捕获组。replaceAll()
所做的是获取与正则表达式匹配的所有内容,并将其替换为替换值。查看-(前面/后面)将执行您想要的操作,因为它们是“零长度”断言:只有在后面有前瞻性的情况下,正则表达式才会匹配您的字符串,但是模式的这些部分不会“计算”为匹配字符串的一部分,因此它们不会被替换。感谢Mena,这非常有用。