2017-05-10 9 views
1

最初の括弧内の"'に置き換えます。 2番目の括弧内の部分文字列は変更されません。例:TEST2周りReplaceAllは部分文字列の最初の出現箇所を置き換えます

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の最初の呼び出し中に交換されていませんか?

答えて

1

これは境界整合\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最初一致

ため前回のマッチまたは文字列の先頭の端部に位置をアサートしますRegEx Demo

+1

* "または文字列の先頭" * - これはあなたが '\\ G(?!^)'を使用する必要がある理由です。 –

関連する問題