在 Ruby 中分隔的解析管道

Parse pipe delimited in 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"]?

只有一个示例字符串,很难知道是否存在任何边缘情况这将不起作用,但您可以使用积极的向前看和向后看以仅在字母旁边的管道上拆分或数字字符,在您给我们的一个示例中:

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