正则表达式只匹配括号中的逗号?

时间:2012-01-27 07:06:59

标签: java regex

我有一个类似于以下内容的字符串:

12,44,foo,bar,(23,45,200),6

我想创建一个与逗号匹配的正则表达式,但只创建不在括号内的逗号(在上面的示例中,除了23和45之后的两个逗号之外的所有逗号)。我该怎么做(Java正则表达式,如果这有所不同)?

4 个答案:

答案 0 :(得分:54)

假设没有嵌套的parens(否则,您不能使用Java Regex执行此任务,因为不支持递归匹配):

Pattern regex = Pattern.compile(
    ",         # Match a comma\n" +
    "(?!       # only if it's not followed by...\n" +
    " [^(]*    #   any number of characters except opening parens\n" +
    " \\)      #   followed by a closing parens\n" +
    ")         # End of lookahead", 
    Pattern.COMMENTS);

此正则表达式使用negative lookahead assertion来确保下一个括号(如果有)不是右括号。只有这样才能使逗号匹配。

答案 1 :(得分:6)

保罗,恢复这个问题,因为它有一个简单的解决方案,没有提到。 (在为regex bounty quest进行一些研究时找到了您的问题。)

现有的解决方案还会检查逗号后面没有括号,但这并不能保证它嵌在括号中。

正则表达式非常简单:

\(.*?\)|(,)

交替的左侧匹配完整的括号集。我们将忽略这些匹配。右侧匹配并捕获第1组的逗号,我们知道它们是正确的逗号,因为它们与左侧的表达式不匹配。

在此demo中,您可以在右下方的窗格中看到第1组捕获。

你说你想要匹配逗号,但你可以使用相同的一般想法来分割或替换。

要匹配逗号,您需要检查第1组。这个完整程序的唯一目标就是做到这一点。

import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;

class Program {
public static void main (String[] args) throws java.lang.Exception  {

String subject = "12,44,foo,bar,(23,45,200),6";
Pattern regex = Pattern.compile("\\(.*?\\)|(,)");
Matcher regexMatcher = regex.matcher(subject);
List<String> group1Caps = new ArrayList<String>();

// put Group 1 captures in a list
while (regexMatcher.find()) {
if(regexMatcher.group(1) != null) {
group1Caps.add(regexMatcher.group(1));
}
} // end of building the list

// What are all the matches?
System.out.println("\n" + "*** Matches ***");
if(group1Caps.size()>0) {
for (String match : group1Caps) System.out.println(match);
}
} // end main
} // end Program

这是live demo

要使用相同的技术进行拆分或替换,请参阅参考文章中的代码示例。

参考

  1. How to match pattern except in situations s1, s2, s3
  2. How to match a pattern unless...

答案 2 :(得分:0)

使用负前瞻的正则表达式

,(?![^(]*\))

答案 3 :(得分:-4)

我不理解对正则表达式的这种迷恋,因为它们不适合用于它们的大多数任务。

String beforeParen = longString.substring(longString.indexOf('(')) + longString.substring(longString.indexOf(')') + 1);
int firstComma = beforeParen.indexOf(',');
while (firstComma != -1) {
    /* do something. */
    firstComma = beforeParen.indexOf(',', firstComma + 1);
}

(当然这假设在它之后总会有一个左括号和一个匹配的右括号。)