2017-09-09 4 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

サンプルストリングが1つしかない場合、これがうまくいかないエッジケースがあるかどうかを知るのは難しいですが、ポジティブなルックアヘッドを使用して、アルファベットまたは数字、一つのサンプルでは、​​あなたが私たちの与えた:その正規表現の

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)は、次の文字が英数字か文字列の最後かどうかを確認する前向きな外観です。

これは、分割したいパイプの周囲の文字が英数字で、周囲の文字の少なくとも1つが、分割しないパイプでは英数字にならないと仮定してのみ動作します。例えば、3本のパイプを分割する必要のあるパイプがある場合や、そうでないパイプがある場合は、実際には非常に複雑になります。

関連する問題