【问题标题】:How do i write a regular expression to capture a word after a number?如何编写正则表达式来捕获数字后的单词?
【发布时间】:2017-02-22 16:02:25
【问题描述】:

我正在使用 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”。但正如你所看到的,我的正则表达式并没有削减它。如何修复它以捕获我需要的内容?

【问题讨论】:

  • 试图在“12.2 word next”中选择“12.2word”或“12.2 word”?
  • 我想要一些可以选择数组的东西——第一个元素是数字“12.2”,第二个元素是单词“word”(即 ["12.2", "word "])
  • 您可以在我编辑的答案@Dave 中找到它

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


【解决方案1】:

你是想在“12.2 word next”中选择“12.2word”还是“12.2 word”?

正如你在 cmets 中回答的那样,在 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。

【讨论】:

    【解决方案2】:

    这应该可行。

    ([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

    【讨论】:

    • 虽然这适用于 "12.2 word" 但它不适用于 "12.2-word next" 或 "12.2word next" ,我都希望将 "12.2" 作为第一个匹配eleemnt 和 "word" 作为第二个匹配元素。
    • 使用[^a-zA-Z0-9] 而不是\s @Dave
    • 这个正则表达式匹配 1.2.27 word 1.2.27 是你接受的匹配吗?
    猜你喜欢
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多