2012-06-11 57 views
28

我需要拆分字符串用正則表達式 - ,::,(和)

(年齡爲25 ::或::姓氏,是-QA6):: AND::(年齡是-20 :: OR ::如first_name-包含檢驗)

串[0] =(年齡是-25 :: OR ::姓氏-是-QA6)

string [1] = AND

串[2] =(年齡爲20 ::或:: FIRST_NAME,包含測試)

我試着寫了這麼多正則表達式的表達式,但沒有按預期工作。

使用以下正則表達式,Matcher.groupCount()返回2,但將結果指定給arraylist返回null作爲元素。

Pattern pattern = Pattern.compile(「(\\)::)?|(:: \\()?」);

我試着用拆分的話)::或::(

我知道正則表達式看起來太傻了,但作爲一個初學者,這是我寫的最好的

+3

概括這個問題就相當於解析表達式與正則表達式,這是不可能的:正則表達式是不是足夠強大。 – dasblinkenlight

+8

如果你真的嘗試過一些東西,這並不是愚蠢的事情:)在詢問之前首先嚐試某些東西的好工作。 – Ewald

+0

只有在'AND'附近''才能將它分解,而不必將'AND'放入分離器? – dantuch

回答

36

您可以使用積極lookahead和lookbehead匹配第一個和最後一個括號。

String str = "(age-is-25::OR::last_name-is-qa6)::AND::(age-is-20::OR::first_name-contains-test)"; 

for (String s : str.split("(?<=\\))::|::(?=\\()")) 
    System.out.println(s); 

輸出:

(age-is-25::OR::last_name-is-qa6) 
AND 
(age-is-20::OR::first_name-contains-test) 

只是注意但是:好像你正在分析某種遞歸語言。正則表達式不擅長這樣做。如果您正在進行高級解析,我會建議您查看其他解析方法。

+8

)這是一個很好的主意,它是第一個不會進行瘋狂猜測的回答者。他顯然更熟悉先進的正則表達式,但他仍然在測試,其餘部分就像「試試這個,如果你幸運的話它就可以工作」 – MarioDS

+1

@dacwe真的是一個聰明的回答夥伴,它+1。 –

+0

@dacwe:非常感謝!順便說一句,我確實nt理解正則表達式中?<=和?=的用法。我從來沒有見過任何教程中的人。你能解釋一下嗎?或者你可以指出一些網址,我可以從那裏獲得一些信息?再次感謝。 – aradhak

-1
textString.split("\\)::|::\\(") 

應該工作。

+0

反斜槓出現兩次...不知道爲什麼格式化是刪除我的第二個反斜槓 – ManojGumber

+3

如果格式化與你的代碼搞亂使它成爲一個代碼塊,或使用像這樣的''這樣的'' – dantuch

+0

它不會包含在)第一個字符串和(在第三個字符串 –

-1

這應該爲你工作。

\)::|::\(
1

對我來說,它看起來像是你壓力的一個重要部分來自需要在搜索字詞中轉義特殊字符。我強烈建議不要手動轉義特殊字符,而是使用Pattern.quote(...)進行轉義。

1

這應該工作

"(?<=\\))::|::(?=\\()"