正则expression式只匹配逗号不在括号内?

我有一个如下所示的string:

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

我想创build一个匹配逗号的正则expression式,但是只有不在括号内的逗号(在上面的例子中,除了23和45之后的两个逗号之外的所有逗号)。 我如何做到这一点(Java正则expression式,如果有所作为)?

假设不能有嵌套的parens(否则,你不能使用Java Regex来完成这个任务,因为不支持recursion匹配):

 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); 

这个正则expression式使用负向前瞻断言来确保下一个括号(如果有的话)不是右括号。 只有这样逗号才可以匹配。

保罗,复活这个问题,因为它有一个没有提到的简单的解决scheme。 (find你的问题,同时做一个正则expression式赏金任务的研究 。)

此外,现有的解决scheme检查逗号后面没有括号,但不能保证它embedded在括号中。

正则expression式非常简单:

 \(.*?\)|(,) 

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

在这个演示中 ,您可以在右下方的窗格中看到组1的捕获。

你说你想匹配的逗号,但你可以使用相同的一般想法拆分或replace。

为了匹配逗号,你需要检查第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 

这里是一个现场演示

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

参考

  1. 除了情况s1,s2,s3,如何匹配模式
  2. 除非…匹配模式

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

 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); } 

(当然,这个假设总是只有一个左括号和一个右括号。