在Ruby中使用split函数时的答案差异

ran*_*183 4 ruby regex split

鉴于以下输入:

line1 = "Hey | Hello | Good | Morning"
line2 = "Hey , Hello , Good , Morning"
file1=length1=name1=title1=nil
Run Code Online (Sandbox Code Playgroud)

使用','将字符串拆分如下:

file1, length1, name1, title1 = line2.split(/,\s*/)
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

puts file1,length1,name1,title1

>Hey
>Hello
>Good
>Morning
Run Code Online (Sandbox Code Playgroud)

但是,使用'|' 分割字符串我收到不同的输出:

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

>H
>e
>y
Run Code Online (Sandbox Code Playgroud)

除了分隔符号(第一种情况下为逗号,第二种情况下为管道)外,两个字符串都相同.我正在使用的分割函数的格式也是相同的,当然,除了分隔字符.是什么导致这种变化?

nha*_*tdh 7

问题是因为|在正则表达式中具有OR的含义.如果你想要文字字符,那么你需要逃避它\|.所以正确的正则表达式应该是/\|\s*/


目前,正则表达式/|\s*/意味着空字符串或一系列空白字符.由于在OR中首先指定了空字符串,因此正则表达式引擎将在每个字符处打破字符串(您可以想象字符之间存在空字符串).如果你交换它/\s*|/,那么空格将优先于空字符串,并且在分割之后在标记列表中将没有空格.