2011-10-07 98 views
4

我的下一個文本正則表達式,如何用|分割和避免分裂時是

aaa|bbbb|cccc|dddd\|eeee|ffff 

之前,我想通過拆分|並在|時排除|通過\之前和獲得

AAA

BBBB

CCCC

DDDD \ | EEEE

FFFF

感謝。

ps:我嘗試過使用一些正則表達式生成器(例如http://txt2re.com/),但坦率地說,正則表達式不過是友好的。

更新:最後我放棄了。正則表達式不是很快(我做了一個基準測試),既不明確(與每個人都可以遵循的函數相比),然後我跳過它,現在我正在使用真正的代碼。

+0

這聽起來像你想要一個負面的後向斷言。 – Gabe

+1

爲什麼會是'dddd \ | eeee'而不是'dddd | eeee'? –

+0

如果你的模式很簡單,你也可以使用迭代遍歷字符,並且只在發現管道'|'時分割,但前面的字符不是反斜槓'\\'。我不確定你的輸入字符串是如何構建的,但是如果你有控制權,你也可以不使用\ |在那個位置,但使用不同的角色,如果這是一個選項。 – jefflunt

回答

2

嘗試添加此爲eyelidlessness的答案評論,但不知道如何將它有格式化......

總之,eyelidlessness答案看起來是正確的對我說:

String str = "aaa|bbbb|cccc|dddd\\|eeee|ffff"; 
    String[] tokens = str.split("(?<!\\\\)\\|"); 
    System.out.println(Arrays.toString(tokens));  

其打印:

[aaa, bbbb, cccc, dddd\|eeee, ffff] 
+0

如果有逃脫的反斜槓怎麼辦?例如'aaaa \\ | bbbb' ... –

+0

是的,這是真的,這不會處理逃脫的反斜槓,但我想這取決於如果這是一個問題。也許他們不會存在於這張海報正在工作的任何領域。 – dule

2

這應做到:

(?<!\\\\)\\| 

如果你想允許反斜槓轉義反斜線,你可以使用:

(?<!(?<!\\\\)\\\\)\\| 

所以給出的字符串aaa|bbbb|cccc|dddd\|eeee\\|ffff,分裂將是:


    aaa 
    bbbb 
    cccc 
    dddd|eeee\* 
    ffff 

*或dddd\|eeee\\如果您沒有剝離逃避反斜槓一些原因。

編輯:不熟悉Java正則表達式風格,每棘輪怪胎的評論增加了逃生。

+0

你可能想用java語法''(?<!\\\\)\\ |「' –

+0

@ratchet怪胎,謝謝。 – eyelidlessness

+0

謝謝,但它不工作:value1:aaa | bbbb | cccc | dddd value2: | eeee | ffff,我想我會採取景區路線,取代「\ |」爲了安全的角色,然後按「|」分割並替換回「\ |」 – magallanes

1

請不要使用split()這個。 (你可以運行Java的支持後向斷言無限期內重複但事實並非如此。)

更好的收集| S之間的所有比賽:

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile("(?:\\\\.|[^\\\\|])*"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

這正確分裂aaa|bbbb\\|cccc|dddd\|eeee|ffff\\\|ggg\\\\|hhhh

aaa 
bbbb\\ 
cccc 
dddd\|eeee 
ffff\\\|ggg\\\\ 
hhhh