考慮一個測試字符串像是標記化忽略轉義字符
Irrelevant start|group 1|group 2 with \| escaped|group 3|group 4|Irrelevant end
這怎麼能使用單一的Java正則表達式,提取全部由棒分離羣體進行解析Java的正則表達式中間的轉義欄(\ |),以及不相關的開始和結束部分(不包含欄)?與背後斷言,已建議在earlier question看
一個問題,就是在Java
不允許變長字符串和上述團體沒有預定義的
考慮一個測試字符串像是標記化忽略轉義字符
Irrelevant start|group 1|group 2 with \| escaped|group 3|group 4|Irrelevant end
這怎麼能使用單一的Java正則表達式,提取全部由棒分離羣體進行解析Java的正則表達式中間的轉義欄(\ |),以及不相關的開始和結束部分(不包含欄)?與背後斷言,已建議在earlier question看
一個問題,就是在Java
不允許變長字符串和上述團體沒有預定義的
你可以用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格式通常應該與解析庫一起使用。
那麼前面加一個反斜槓的管道呢?如果該反斜槓也逃脫了呢?除非創建脆弱代碼的目的,否則這不是正則表達式的任務。 –
您遺漏的一點是您使用的是負面後視。 –
鮑里斯,我同意它很脆弱。大衛,我添加了一些關於負面後視的更多細節。感謝您的評論! – chilemagic
此外馬特的答案,我認爲這是一個非常不錯的主意,如果你仍然有興趣在正則表達式,你可以用這一個:
([\w ]+(\\\|[\w ]+)?)
在這裏,您可以檢查工作的例子:
http://regex101.com/r/hK3fD3/1
正如你可以看到每個比賽的每個第一組包含相關的內容,你可以放棄第一場和最後一場比賽。
希望能幫到
不要爲此使用正則表達式。請不要。像優秀的OpenCSV一樣使用CSV解析庫。 –
這是一個非常好的主意,我也考慮過這個主意。更快,是逐字讀取字符串,並在飛行中分割。這是我目前正在做的。 – PNS
也在正則表達式中。 – PNS