2012-03-16 22 views
2

我需要拆分傳遞正則表達式的字符串,但拆分令牌只是正則表達式的組1。舉個例子:考慮捕獲組的Java模式拆分

原始字符串=使用分割形成"paulo\\;Is\\;In;Real;Doubt"

陣列= ["paulo\\;Is\\;In", "Real", "Doubt"]

我的第一個想法是爲正則表達式使用方法:[^\\\\][;],但它顯然沒有奏效。

產量爲:["paulo\\;Is\\;I", "Rea", "Doubt"](我使用的方法String.split()

我的第二個想法是使用;作爲一個羣體:[^\\\\]([;]),但我不能告訴分裂的方式,僅僅考慮group(1)作爲分割標記。

+0

什麼是你期望得到的陣列? – Alex 2012-03-16 15:59:42

+0

@Alex它看起來像所希望的輸出是'[「paulo」,「是」,「在;真實;疑問」] – Danny 2012-03-16 16:08:17

+0

對不起...預期的數組是錯誤的... – user1274399 2012-03-16 16:08:57

回答

3

你這個問題很難回答,因爲它是完全不清楚。你說你的分裂記號是「只是正則表達式的第一組」。什麼正則表達式的組1?

編輯:仍然很難回答,你爲什麼不澄清?無論如何,如果你想要的是「分開';'但是隻有當它沒有用'\''轉義時」,那麼你可以使用負向後視來獲得你想要的。

例子:

"paulo\\;Is\\;In;Real;Doubt".split("(?<!\\\\);"); 

[ "paulo\;Is\;In", "Real", "Doubt" ] 
+0

是的,你是對的,對不起,剛剛糾正了這個問題。 – user1274399 2012-03-16 16:13:55

+0

他編輯後,看起來不像他想要的。編輯 – assylias 2012-03-16 16:14:45

+0

試圖回答我認爲的問題。 – wds 2012-03-16 16:30:00

0

的問題是,下面的表達式爲true:

("\;").equals(";") 

所以你的原始字符串等於:

"paulo;Is;In;Real;Doubt" 
0

好吧,我不得不修改你的輸入一點點,因爲我得到了錯誤,當

String x = "paulo\\;Is\\;In;Real;Doubt"; 
String[] res = x.split("\\\\;"); 
0

如果逃逸能逃脫任何東西,只需用一個簡單的全局正則表達式,用一個捕獲組就可以找到所有的東西。

原正則表達式:

(?:(?<=;)|(?<=^))([^;\\]*(?:\\.[^;\\]*)*)(?:;|$)

擴展:

(?:        // prevent (mitigate) re-capture of last field 
    (?<=;) 
| (?<=^) 
) 

([^;\\]* (?:\\.[^;\\]*)*)  // Capture the field, grp 1 (can be blank) 

(?:        // The delimiter or end o string        
    ; 
| 
    $ 
)