2010-07-19 131 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...

相關問題