从数字之间抓取整个单词

时间:2016-03-26 19:33:32

标签: ruby regex

我有一个字符串,其中包含一个单词和多个数字。我想按字分区字符串。例如,

"100 1990 top 1000 500" #=> ["100 1990 ", "top", " 1000 500"]

我认为这会奏效,但它没有:

'100 1990 top 1000 500'.partition(/[\ba-zA-Z\b]/) # => ["100 1990 ", "t", "op 1000 500"]

但是,使用Rubular,上面的正则表达式确实匹配给定上述字符串的整个单词"top"(并且只有那个单词)。

我错过了什么?

3 个答案:

答案 0 :(得分:0)

在这个特定的例子中,没有必要使用regexp,与简单的字符串方法相比通常更慢:

split完全符合您的要求:

'1990 top 1000'.split
#=> ["1990", "top", "1000"]

当您对单词两侧的子字符串感兴趣时,您可能希望将该单词用作split的参数:

'1990 top 1000'.split('top')
#=> ["1990 ", " 1000"]

或者只使用这个正则表达式:

'1990 top 1000'.partition /\b[a-zA-Z]+\b/
#=> ["1990 ", "top", " 1000"][

正如Wiktor所说,这个正则表达式与不在A-Z范围内的字符不匹配。要匹配Ä,ß或ç等unicode字符,您可能需要使用[[:alpha:]]字符类:

'1990 äop 1000'.partition /\b[[:alpha:]]+\b/
#=> ["1990 ", "äop", " 1000"]

详细了解Regexp character classes

答案 1 :(得分:0)

你的正则表达式恰好匹配一个符号,\b(退格,它不是单词边界,因为字符类中的\b失去了它的特殊含义而变成了一个转义序列)或ASCII字母(来自a-zA-Z范围的字母)。所以,rubular.com显示你有3个单独的比赛。您可以通过在模式上放置捕获组来自行检查(请参阅your regex demo)。

您可以将/\p{L}+/正则表达式(与1个或多个字母匹配)与partition一起使用:

'1990 top 1000'.partition(/\p{L}+/)

请参阅IDEONE demo

如果你的字符串只包含1个单词,那么这应该有效。 BTW, \p{L}匹配任何Unicode字母,而不仅仅是ASCII

答案 2 :(得分:0)

很难回答你“失踪”的内容,但你可能误解的是正则表达式中的字符范围[]。它表达一个字符。 [\ba-zA-Z\b]表示单词边界,小写字母或大字母(或冗余地,单词边界)。你正在用一个这样的角色进行分区,这不是你想要的。