[英]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.