我有一个字符串,其中包含一个单词和多个数字。我想按字分区字符串。例如,
"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"
(并且只有那个单词)。
我错过了什么?
答案 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"]
答案 1 :(得分:0)
你的正则表达式恰好匹配一个符号,\b
(退格,它不是单词边界,因为字符类中的\b
失去了它的特殊含义而变成了一个转义序列)或ASCII字母(来自a-z
或A-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]
表示单词边界,小写字母或大字母(或冗余地,单词边界)。你正在用一个这样的角色进行分区,这不是你想要的。