2010-07-19 128 views
2

我正在寻找将空格分隔的字符串拆分为一系列搜索字词。但是,在这样做时,我想忽略括号内的空格。例如,我希望能够将字符串从正则表达式的括号中排除字符串吗?

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

分成

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

有谁知道如何做在Java中这样使用正则表达式?

谢谢!

+0

它能迅速变得棘手:将* “a,(,c,),search:(1,2,3),d”*是一个有效的输入,例如? – SyntaxT3rr0r 2010-07-19 22:23:45

+0

我将搜索内容分解为其组成部分后检查内容。我错在拒绝事情的一面,所以我想将上面的字符串拆分为[a] [(,c,)] [search:(1,2,3)] [d]。然后我会在其他地方注意到(,c,)不是一个有效的术语,并拒绝整体搜索。 – Jack 2010-07-21 19:46:39

回答

2

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

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

这采用的是常见的技巧,处理字符中的一个长字符串,就好像它是一个单一的字符。在右侧,我们将非空白字符与\S匹配。在左侧,我们将一组平衡的括号与中间的任何内容进行匹配。

最终的结果是,一组平衡的括号被当作是单个字符来处理,所以正则表达式作为一个整体匹配单个单词,其中一个单词可以包含这些括号内的组。

(请注意,因为这是一个正则表达式不能处理嵌套的括号。括号内的一组是极限。)

+0

+1,但由于他既不需要逗号也不需要零宽度匹配,所以这会更接近:'(?:\([^)] * \)| [^,\ s])'([demo](http: //regex101.com/r/yJ0jB2)):) – zx81 2014-06-16 09:45:50

1

这个问题已经陷入没有提及另一种解决方案,所以我会后它在这里完成。这种情况与此类似问题[“正则表达式匹配的模式,不包括......”] [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...

相关问题