从正则表达式中排除括号内的字符串?

时间:2010-07-19 22:12:21

标签: java regex

我希望将以空格分隔的字符串拆分为一系列搜索字词。但是,这样做我想忽略括号内的空格。例如,我希望能够分割字符串

a, b, c, search:(1, 2, 3), d

进入

[[a] [b] [c] [search:(1, 2, 3)] [d]]

有人知道如何在Java中使用正则表达式吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

这不是一个完整的正则表达式,但它会让你到那里:

(\([^)]*\)|\S)*

这使用了一个常见的技巧,将一长串字符视为单个字符。在右侧,我们将非空白字符与\S匹配。在左侧,我们匹配一组平衡的括号与之间的任何内容。

最终结果是,一组平衡的括号被视为单个字符,因此整个正则表达式匹配单个单词,其中单词可以包含这些带括号的组。

(请注意,因为这是一个正则表达式,所以它无法处理嵌套括号。一组括号是限制。)

答案 1 :(得分:1)

这个问题有另一个没有提到的解决方案,所以我会在这里发布完成。这种情况类似于这个问题["正则表达式匹配模式,不包括......"] [4]

我们可以通过一个非常简单的正则表达式来解决这个问题:

\([^)]*\)|(\s*,\s*)

交替|的左侧匹配完成(parentheses)。我们将忽略这些匹配。右侧匹配并捕获第1组的逗号和周围空格,我们知道它们是正确的撇号,因为它们与左侧的表达式不匹配。我们将用一些独特的东西替换这些逗号,然后拆分。

此程序显示了如何使用正则表达式(请参阅online demo底部的结果):

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 = "a, b, c, search:(1, 2, 3), d";
Pattern regex = Pattern.compile("\\([^)]*\\)|(\\s*,\\s*)");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
if(m.group(1) != null) m.appendReplacement(b, "SplitHere");
else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
String[] splits = replaced.split("SplitHere");
for (String split : splits) System.out.println(split);
} // end main
} // end Program

参考

How to match (or replace) a pattern except in situations s1, s2, s3...