正则表达式只匹配逗号而不在括号中?
我有一个字符串,如下所示:
12,44,foo,bar,(23,45,200),6
我想创建一个与逗号匹配的正则表达式,但只创建不在括号内的逗号(在上面的示例中,除了23和45之后的两个逗号之外,所有逗号)。我该怎么做(Java正则表达式,如果这有区别的话)?
我有一个字符串,如下所示:
12,44,foo,bar,(23,45,200),6
我想创建一个与逗号匹配的正则表达式,但只创建不在括号内的逗号(在上面的示例中,除了23和45之后的两个逗号之外,所有逗号)。我该怎么做(Java正则表达式,如果这有区别的话)?
假设不能有嵌套的 parens(否则,您不能对此任务使用 Java 正则表达式,因为不支持递归匹配):
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);
此正则表达式使用否定前瞻断言来确保后面的下一个括号(如果有)不是右括号。只有这样,逗号才允许匹配。
保罗,复活了这个问题,因为它有一个简单的解决方案,没有提到。(在对正则表达式赏金任务进行一些研究时发现了您的问题。
此外,现有解决方案还会检查逗号后面是否没有括号,但这并不能保证它嵌入在括号中。
正则表达式非常简单:
\(.*?\)|(,)
交替的左侧与完整的括号集匹配。我们将忽略这些匹配项。右侧匹配并捕获组 1 的逗号,我们知道它们是正确的逗号,因为它们与左侧的表达式不匹配。
在此演示中,您可以在右下窗格中看到组 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
这是一个现场演示
若要使用相同的技术进行拆分或替换,请参阅参考中文章中的代码示例。
参考