在Ruby中分隔的解析管道

时间:2017-09-09 21:30:17

标签: ruby csv parsing string-parsing

我正在尝试解析管道分隔文件。像

这样的东西

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"]

1 个答案:

答案 0 :(得分: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个管道,有时它们不需要拆分,那么事情会很快变得复杂得多。