使用非单词字符正则表达式分割字符串时的奇怪行为

时间:2013-01-01 11:27:35

标签: ruby regex ruby-on-rails-3

案例1(尾随空格)

> "on behalf of all of us  ".split(/\W+/)
 => ["on", "behalf", "of", "all", "of", "us"] 

但是如果有前导空格则会给出以下

案例2(领先空间)

> "  on behalf of all of us".split(/\W+/)
 => ["", "on", "behalf", "of", "all", "of", "us"] 

我也期待案例2案例2的结果。

ADDED

> "@dhh congratulations!!".split(/\W+/)
 => ["", "dhh", "congratulations"] 

有人请帮我理解这种行为吗?

3 个答案:

答案 0 :(得分:4)

<强> [更新]

跳过正则表达式,只是在太空中拆分!

> "@dhh congratulations!!".split
 => ["@dhh", "congratulations"] 

\W匹配任何非单词字符,包括空格。因此,解析器在开始时看到一个空格&amp;空间后的一些字符;它分裂了。但是如果它最后的空间,就没有其他冗长的char [a-zA-Z0-9]可以分开。

要获得一致的行为,您应该使用#strip方法删除空格。

案例1(尾随空格)

1.9.3p327 :007 > " on behalf of all of us ".strip.split(/\W+/) 
 => ["on", "behalf", "of", "all", "of", "us"] 

案例2(领先空间)

1.9.3p327 :008 > "on behalf of all of us ".strip.split(/\W+/) 
 => ["on", "behalf", "of", "all", "of", "us"]

答案 1 :(得分:1)

来自docs

  

拆分(模式= $;,[限制])→anArray

     

[...]   如果省略limit参数,则禁止尾随空字段。如果limit是正数,则最多将返回该字段数(如果limit为1,则整个字符串将作为数组中的唯一条目返回)。如果为负数,则返回的字段数没有限制,并且不会抑制尾随空字段。

答案 2 :(得分:0)

仅供参考,以下是为我工作

 " @dhh congratulations!!".gsub(/^\W+/,'').split /\W+/

另一个

 " @dhh congratulations!!".scan /\w+/

两者都给出了预期的结果。但是对于像

这样的简短形式有一个警告
 > " Don't be shy.".scan /\w+/
 => ["Don", "t", "be", "shy"]  

我实际上收集的不是文章,连词,介词等等。所以无论如何我忽略了这些简短的形式,因此我使用了这个解决方案。

我正在准备推文中的词云。如果您知道任何经过验证的算法,请分享。