从正则表达式的括号中排除字符串吗?
我正在寻找将空格分隔的字符串拆分为一系列搜索字词。但是,在这样做时,我想忽略括号内的空格。例如,我希望能够将字符串从正则表达式的括号中排除字符串吗?
a, b, c, search:(1, 2, 3), d
分成
[[a] [b] [c] [search:(1, 2, 3)] [d]]
有谁知道如何做在Java中这样使用正则表达式?
谢谢!
这不是一个完整的正则表达式,但它会让你有:
(\([^)]*\)|\S)*
这采用的是常见的技巧,处理字符中的一个长字符串,就好像它是一个单一的字符。在右侧,我们将非空白字符与\S
匹配。在左侧,我们将一组平衡的括号与中间的任何内容进行匹配。
最终的结果是,一组平衡的括号被当作是单个字符来处理,所以正则表达式作为一个整体匹配单个单词,其中一个单词可以包含这些括号内的组。
(请注意,因为这是一个正则表达式不能处理嵌套的括号。括号内的一组是极限。)
+1,但由于他既不需要逗号也不需要零宽度匹配,所以这会更接近:'(?:\([^)] * \)| [^,\ s])'([demo](http: //regex101.com/r/yJ0jB2)):) – zx81 2014-06-16 09:45:50
这个问题已经陷入没有提及另一种解决方案,所以我会后它在这里完成。这种情况与此类似问题[“正则表达式匹配的模式,不包括......”] [4]
我们可以用一个精美的简单的regex解决这个问题:
\([^)]*\)|(\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...
它能迅速变得棘手:将* “a,(,c,),search:(1,2,3),d”*是一个有效的输入,例如? – SyntaxT3rr0r 2010-07-19 22:23:45
我将搜索内容分解为其组成部分后检查内容。我错在拒绝事情的一面,所以我想将上面的字符串拆分为[a] [(,c,)] [search:(1,2,3)] [d]。然后我会在其他地方注意到(,c,)不是一个有效的术语,并拒绝整体搜索。 – Jack 2010-07-21 19:46:39