在java中使用regex替换括号中的逗号

NET*_*ion 8 java regex

我只想在内部括号中替换逗号.

例如

 Progamming languages (Java, C#, Perl)
Run Code Online (Sandbox Code Playgroud)

Progamming languages (Java or C# or Perl)
Run Code Online (Sandbox Code Playgroud)

但它不应该在下面的字符串中重复逗号

Progamming languages Java, C#, Perl
Run Code Online (Sandbox Code Playgroud)

它会正确替换,但不匹配.

 String test  = "Progamming languages (Java, C#, Perl)";
 String test1 = "Progamming languages Java, C#, Perl"


 String foo = replaceComma(test);
 String foo1 = replaceComma(test1);


 private static String replaceComma(String test)
 {
    String patternStr= "\\((?:.*)(,)(?:.*)\\)";
    Pattern pattern = Pattern.compile(patternStr);
    Matcher matcher= pattern.matcher(test);

    if(matcher.matches())
    {
      return  test.replaceAll("(,)", " or ");
    }

    return  test;

 }
Run Code Online (Sandbox Code Playgroud)

UPDATE

String.replaceAll("(,)", " or "); 当你有像这样的字符串时将无法工作

String test ="学习,语言(Java,C#,Perl)";

所以你必须使用@polygenelubricants代码

pol*_*nts 8

你可以像这样使用正向前瞻 (?=…):

    String COMMA_INSIDE = ",(?=[^()]*\\))";
    String text = "a, b, c, (d, e, f), g, h, (i, j, k)";
    System.out.println(
        text.replaceAll(COMMA_INSIDE, " OR")
    );
    // a, b, c, (d OR e OR f), g, h, (i OR j OR k)
Run Code Online (Sandbox Code Playgroud)

这与逗号匹配,但前提是右边的第一个括号是结束类型.

[^…]是一个否定的角色类.[^()]匹配除括号外的任何内容.这*是零次或多次重复.在\)(写为"\\)"一个Java字符串字面量),一个右括号匹配,从字面上.反斜杠逃脱了分组的特殊元字符.

这假设输入字符串格式正确,即括号始终是平衡的而不是嵌套的.