【问题标题】:Ruby Regex matching helpRuby 正则表达式匹配帮助
【发布时间】:2024-09-24 00:45:01
【问题描述】:

这只是一个笼统的“我的正则表达式出了什么问题,它没有提取出我所期望的一切”的问题。

这是我的字符串:

"Mon 0900-1600 1700-2000"

我希望能够抽出时间"0900-1600""1700-2000"

这是我的正则表达式/([0-9]{4}-[0-9]{4})/,虽然它在查找第一次出现的时间时效果很好,但它不会返回与第二次匹配的匹配项。有人能告诉我为什么吗?

这是我的实际代码 sn-p 记录:

str = "Mon 0900-1600 1700-2000"

/([0-9]{4}-[0-9]{4})/.match(str)  #<MatchData "0900-1600">

【问题讨论】:

    标签: ruby regex string string-matching


    【解决方案1】:

    尝试改用string#scan

    ruby-1.9.2-p136 :001 > str = "Mon 0900-1600 1700-2000"
     => "Mon 0900-1600 1700-2000" 
    ruby-1.9.2-p136 :002 > str.scan /([0-9]{4}-[0-9]{4})/
     => [["0900-1600"], ["1700-2000"]]
    

    【讨论】:

      【解决方案2】:

      为什么不使用 String#split?

      asdf = "Mon 0900-1600 1700-2000"
      asdf.split(' ')[1,2] #=> ["0900-1600", "1700-2000"]
      

      否则简化并使用:

      asdf.scan(/\d+-\d+/) #=> ["0900-1600", "1700-2000"]
      

      【讨论】:

      • split 适用于您要丢弃的子字符串遵循简单模式时,而 scan 适用于您要获取的子字符串遵循简单模式时。在这种情况下,它绝对是后者。我认为你没有理由在这种情况下使用 split。
      • @sawa,没有“绝对”。我们所知道的问题就是OP所说的。根据描述,两者都足够了,但是拆分更简单。
      • 这里使用split需要两个步骤。您必须执行[1, 2] 才能摆脱"Mon"。这是因为您要丢弃的第一个子字符串 ("Mon") 和分隔符 " " 不是同质的。这不比第二个示例中的scan 一步完成更复杂吗?