Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中使用正则表达式非捕获组替换字符串_Java_Regex_Automation - Fatal编程技术网

如何在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,这非常有用。