我正在尋找將空格分隔的字符串拆分爲一系列搜索字詞。但是,在這樣做時,我想忽略括號內的空格。例如,我希望能夠將字符串從正則表達式的括號中排除字符串嗎?
a, b, c, search:(1, 2, 3), d
分成
[[a] [b] [c] [search:(1, 2, 3)] [d]]
有誰知道如何做在Java中這樣使用正則表達式?
謝謝!
我正在尋找將空格分隔的字符串拆分爲一系列搜索字詞。但是,在這樣做時,我想忽略括號內的空格。例如,我希望能夠將字符串從正則表達式的括號中排除字符串嗎?
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