我希望将以空格分隔的字符串拆分为一系列搜索字词。但是,这样做我想忽略括号内的空格。例如,我希望能够分割字符串
a, b, c, search:(1, 2, 3), d
进入
[[a] [b] [c] [search:(1, 2, 3)] [d]]
有人知道如何在Java中使用正则表达式吗?
谢谢!
答案 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...