4

次の入力があるとします。

line1 = "Hey | Hello | Good | Morning"
line2 = "Hey , Hello , Good , Morning"
file1=length1=name1=title1=nil

「,」を使用して、次のように文字列を分割します。

file1, length1, name1, title1 = line2.split(/,\s*/)

次の出力が得られます。

puts file1,length1,name1,title1

>Hey
>Hello
>Good
>Morning

ただし、「|」を使用する 文字列を分割するには、別の出力を受け取ります。

file1, length1, name1, title1 = line2.split(/|\s*/)
puts file1,length1,name1,title1

>H
>e
>y

区切り記号 (最初のケースではカンマ、2 番目のケースではパイプ) を除いて、両方の文字列は同じです。私が使用している分割関数の形式も、もちろん区切り文字を除いて同じです。この変動の原因は何ですか?

4

1 に答える 1

7

問題は|、正規表現で OR の意味を持つためです。リテラル文字が必要な場合は、エスケープする必要があります\|。したがって、正しい正規表現は/\|\s*/


現在、正規表現/|\s*/は空の文字列または一連の空白文字を意味します。OR で最初に空の文字列が指定されているため、正規表現エンジンは文字列を文字ごとに分割します (文字間に空の文字列があることが想像できます)。にスワップすると/\s*|/、可能な場合は空の文字列よりも空白が優先され、分割後のトークンのリストに空白がなくなります。

于 2012-09-02T03:25:54.763 に答える