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

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

4

1 回答 1

7

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


目前,正则表达式/|\s*/表示空字符串或一系列空白字符。由于在 OR 中首先指定了空字符串,因此正则表达式引擎将在每个字符处分解字符串(您可以想象字符之间有一个空字符串)。如果将其交换为/\s*|/,则在可能的情况下,空格将优先于空字符串,并且拆分后令牌列表中将没有空格。

于 2012-09-02T03:25:54.763 回答