繁体   English   中英

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

[英]Replace comma in parentheses using regex in java

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

例如

 Progamming languages (Java, C#, Perl)

Progamming languages (Java or C# or Perl)

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

Progamming languages Java, C#, Perl

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

 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;

 }

UPDATE

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

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

所以你必须使用@polygenelubricants代码

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

    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)

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

[^…]是一个否定的字符类 [^()]匹配括号以外的任何内容。 *是零或更多重复 \\) (写为"\\\\)"作为Java字符串文字)字面上匹配右括号。 反斜杠逃脱了分组的特殊元字符。

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

您的错误是使用matches而不是在此处find

if (matcher.find())

文档

  • matches方法尝试将整个输入序列与模式匹配。
  • find方法扫描输入序列,寻找与模式匹配的下一个子序列。

但是你的代码也稍微简化了这个问题 - 它取代了所有的逗号,即使其中只有一个在括号中。 将正则表达式用于此类任务可能不是一个好主意。

相反,你可以一次扫描一个字符串,并计算你在里面的括号数。 当你看到(增加计数,当你看到一个)减少计数。 如果看到a ,则检查当前计数是否为零。

另一种方法是在正则表达式中使用正向前瞻和正向外观。 这样你就可以搜索在'(',但在''之后'之后出现的逗号。

(?=X)积极前瞻

(?<=X)正面观察

马克是正确的,你需要一个循环而不是replaceAll。 但是你仍然可以使用我所描述的技术使用正则表达式。

String  replaceComma(String input)
{
 String[] strSplit=input.split("[\\(\\)]");
  if(strSplit.length==2)
   input=input.replaceAll(", "," or ");
 return input;
}

更新对于字符串,如“学习,语言(Java,C#,Perl)”

String  replaceComma(String input)
{
String[] splitStr=input.split("[\\(\\)]");
 if(splitStr.length==2)
   input=input.replace(splitStr[1],splitStr[1].replaceAll(", ", " or "));
return input;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM