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

时间:2010-09-12 23:42:12

标签: java regex

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

例如

 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;

 }

更新

当你有像这样的字符串

时,

String.replaceAll("(,)", " or ");将无效

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

所以你必须使用@polygenelubricants代码

4 个答案:

答案 0 :(得分:7)

您可以像这样使用正面lookahead (?=…)

    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)

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

[^…]negated character class[^()]匹配括号以外的任何内容。 *为零或更多repetition\)(写为"\\)"作为Java字符串文字)与字面上的右括号匹配。反斜杠转义了grouping的特殊元字符。

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

答案 1 :(得分:1)

您的错误是matches而不是find

if (matcher.find())

来自documentation

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

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

相反,您可以一次扫描一个字符串,并计算您内部有多少对括号。当您看到(增加计数时,以及当您看到)减少计数时。如果您看到,,请检查当前计数是否为零。

答案 2 :(得分:0)

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

(?=X)积极向前看

(?<=X)积极的背后隐藏

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

答案 3 :(得分:0)

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

更新对于String,例如“学习,语言(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;
}