我想在内部括号中替换逗号。
例如
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代码
答案 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())
- 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;
}