2017-09-09 54 views
0

我想解析一個管道分隔文件。像在Ruby中分隔的解析管道

parsed_string = "field1|field2".split("|") -> ["field1", "field2"]

東西很容易。但我怎麼能解析管道周圍的每個領域像

"|field1|field2_has_a_|_in_it|field3|field4 is really ||| happy| -> ["field1", "field2_has_a_|_in_it","field3", "field4 is really ||| happy"]

+0

爲什麼'.split(「|」)'不夠?預期與實際產出是多少? –

+0

@maxpleaner,我的apoligies。我在上面的問題中增加了預期的輸出。 – TheRoyalTnetennba

+0

恐怕你需要一個在這種情況下定義的詞位的整個列表 - )) – marmeladze

回答

0

只有一個樣本字符串,很難知道是否存在無法工作的邊界情況,但是您可以使用積極的前瞻性方法,並且只需將字符串旁邊的管道數字字符,一個樣品中,你給我們:

string = "|field1|field2_has_a_|_in_it|field3|field4 is really ||| happy|" 
string.split(/(?<=\p{Alnum}|\A)\|(?=\p{Alnum}|\z)/).reject(&:empty?) 
# => ["field1", "field2_has_a_|_in_it", "field3", "field4 is really ||| happy"] 

該正則表達式的這麼快破敗,(?<=\p{Alnum}|\A)背後是正面看,它檢查,如果前一個字符是字母數字或字符串的開始。 \|匹配單個管道字符。 (?=\p{Alnum}|\z)是一個積極的展望,看看下一個字符是字母數字還是字符串的結尾。

這隻適用於假設您要拆分的管道周圍的字符是字母數字,並且至少有一個周圍的字符在您不拆分的管道上不是字母數字。例如,如果有一些管道需要拆分一系列3根管道,有時甚至無法拆分,那麼情況會非常迅速地變得複雜得多。