Java ReplaceAll只替换子字符串的第一个出现
我想将第一个括号内的Java ReplaceAll只替换子字符串的第一个出现,java,regex,replaceall,Java,Regex,Replaceall,我想将第一个括号内的“替换为”。第二个括号内的子字符串应保持不变。示例: String test = "(\"test1\", \"test2\") (\"test3\", \"test4\")"; //wanted output is ('test1', 'test2') ("test3", "test4") String regex = "(^[^\\)]*?)\"(.*?)\""; test = test.replaceAll(regex, "$1'$2'"); System.out.pr
“
替换为”
。第二个括号内的子字符串应保持不变。示例:
String test = "(\"test1\", \"test2\") (\"test3\", \"test4\")"; //wanted output is ('test1', 'test2') ("test3", "test4")
String regex = "(^[^\\)]*?)\"(.*?)\"";
test = test.replaceAll(regex, "$1'$2'");
System.out.println(test); // output is ('test1', "test2") ("test3", "test4")
test = test.replaceAll(regex, "$1'$2'");
System.out.println(test); // output is ('test1', 'test2') ("test3", "test4")
为什么在第一次调用replaceAll时不替换test2周围的
“
这是使用边界匹配器的良好用例\G
:
String test = "(\"test1\", \"test2\") (\"test3\", \"test4\")";
final String regex = "(^\\(|\\G(?!^),\\h*)\"([^\"]+)\"";
test = test.replaceAll(regex, "$1'$2'");
System.out.println(test);
//=> ('test1', 'test2') ("test3", "test4")
\G
在上一个匹配的末尾或第一个匹配的字符串的开头断言位置
“或字符串的开头”-这就是为什么需要使用\\G(?!^)
。