我正在尝试解析管道分隔文件。像
这样的东西 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 :(得分: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个管道,有时它们不需要拆分,那么事情会很快变得复杂得多。