如何编写正则表达式来捕获数字后面的单词?

时间:2017-02-22 16:02:25

标签: ruby-on-rails regex numbers ruby-on-rails-5

我正在使用Rails 5.我在编写正则表达式时遇到问题。我想编写一个表达式,它将解析一个字符串,查找一个正数,然后是数字后面的第一个单词,无论数字和下一个单词之间是否有空格或其他类型的单词边界。所以我试过

2.4.0 :006 > str = "2g"
 => "2g" 
2.4.0 :007 > str.match(/\W?(([0-9]+(\.[0-9]+)?)\W*(^[0-9:\/]+))/)
 => nil 

但是你可以看到没有匹配发生。我希望这场比赛能够获得“2”,然后是“g”。同样,如果我有一个像

这样的字符串
2.4.0 :008 > str = "12.2 word next"
 => "12.2 word next" 
2.4.0 :009 > str.match(/\W?(([0-9]+(\.[0-9]+)?)\W*(^[0-9:\/]+))/)
 => nil 

我希望正则表达式捕获“12.2”,然后是下一个单词“word”。但正如你可以看到我的正则表达式并没有削减它。如何修复它以捕获我需要的东西?

2 个答案:

答案 0 :(得分:0)

这应该有效。

([0-9.]+)\s(\w+)

输入:

12.2 word

输出:

12.2
word

Ruby代码:

re = /([0-9.]+)\s(\w+)/
str = '12.2 word'

# Print the match result
str.scan(re) do |match|
    puts match.to_s
end

请参阅:https://regex101.com/r/ncVEAT/1

答案 1 :(得分:0)

您是否尝试在“12.2 word next”中选择“12.2word”或“12.2 word”?

正如你在评论中回答的那样,在group1中有浮点数,在group2中有单词:

 (\d+\.\d+|\d+)[^a-zA-Z0-9]*([a-zA-Z]+)
 Full match 6-15    `12.2 good`
 Group 1.   6-10    `12.2`
 Group 2.   11-15   `good`

<小时/> 我的第一个答案是:

 (\d+(\.\d{0,})?)[^a-zA-Z0-9]*([a-zA-Z]+)
 for " 12.2 good "
 Full match 6-15    `12.2 good`
 Group 1.   6-10    `12.2`
 Group 2.   8-10    `.2`
 Group 3.   11-15   `good`

在此示例中,Group1是您的整数部分,Group2为null或等于.2。