2014-07-05 142 views
0

考慮一個測試字符串像是標記化忽略轉義字符

Irrelevant start|group 1|group 2 with \| escaped|group 3|group 4|Irrelevant end 

這怎麼能使用單一的Java正則表達式,提取全部由棒分離羣體進行解析Java的正則表達式中間的轉義欄(\ |),以及不相關的開始和結束部分(不包含欄)?與背後斷言,已建議在earlier question

一個問題,就是在Java不允許變長字符串和上述團體沒有預定義的

+0

不要爲此使用正則表達式。請不要。像優秀的OpenCSV一樣使用CSV解析庫。 –

+0

這是一個非常好的主意,我也考慮過這個主意。更快,是逐字讀取字符串,並在飛行中分割。這是我目前正在做的。 – PNS

+0

也在正則表達式中。 – PNS

回答

2

你可以用split做到這一點。我們想要在|之前進行拆分,但前面沒有\。我們必須在我們的正則表達式中跳轉|以匹配|,而不是將其用作or。爲了匹配我們的正則表達式中的文字\(負面的背後),我們需要\\\\

import java.util.Arrays; 

public class Test { 

    public static void main(String[] args) { 
     String str = "Irrelevant start|group 1|group 2 with \\| escaped|group 3|group 4|Irrelevant end"; 
     System.out.println(str); 

     String[] arr = str.split("(?<!\\\\)\\|"); 

     String[] new_arr = Arrays.copyOfRange(arr, 1, arr.length - 1); 
     System.out.println(Arrays.toString(arr)); 
     System.out.println(Arrays.toString(new_arr)); 

    } 
} 

輸出:

Irrelevant start|group 1|group 2 with \| escaped|group 3|group 4|Irrelevant end 
[Irrelevant start, group 1, group 2 with \| escaped, group 3, group 4, Irrelevant end] 
[group 1, group 2 with \| escaped, group 3, group 4] 

對於負看看一個簡單的例子的背後,讓我們看一看(?<!a)b。這與b相匹配,但前面沒有a。在我們的例子中,我們想要匹配一個文字\而不是一個a|而不是一個b,這就是爲什麼我們需要所有的\。有很多資源可供瀏覽,但here是一個如果你想進一步閱讀。


此外,鮑里斯蜘蛛指出,這是脆弱的,有些情況下,它將無法正常工作。與不應該用正則表達式解析XML類似,CSV格式通常應該與解析庫一起使用。

+1

那麼前面加一個反斜槓的管道呢?如果該反斜槓也逃脫了呢?除非創建脆弱代碼的目的,否則這不是正則表達式的任務。 –

+0

您遺漏的一點是您使用的是負面後視。 –

+0

鮑里斯,我同意它很脆弱。大衛,我添加了一些關於負面後視的更多細節。感謝您的評論! – chilemagic

1

此外馬特的答案,我認爲這是一個非常不錯的主意,如果你仍然有興趣在正則表達式,你可以用這一個:

([\w ]+(\\\|[\w ]+)?) 

在這裏,您可以檢查工作的例子:

http://regex101.com/r/hK3fD3/1

正如你可以看到每個比賽的每個第一組包含相關的內容,你可以放棄第一場和最後一場比賽。

希望能幫到