使用正则表达式

时间:2015-04-22 13:32:12

标签: ruby regex

我有一个字符串,如下所示

  

“Temporada 2015”

我也得到字符串

  

“Temporada 8”

我需要匹配并仅提取字符串2015和8中的数字。 我如何使用正则表达式来做到这一点。我尝试过如下

doc.text_at('header.headerInfo > h4 > b').match(/(Tempo).*(\d+)/)[2]

但是第一次而不是2015年只返回了5次。 我如何匹配两者并仅返回nos。??

5 个答案:

答案 0 :(得分:2)

.*是“贪婪的”。它匹配尽可能多的字符。所以它只留下\d+的一位数。

如果您的字符串已知不包含其他数字,则可以执行

.scan(/\d+/).first

否则你可以匹配非数字

.match(/(Tempo)[^\d]*(\d+)/)[2]

答案 1 :(得分:1)

因为.*是贪婪的,它尽可能匹配所有字符,所以它会返回所有前面字符贪婪匹配的最后一个数字。通过将贪婪的.*变为非贪婪的.*?,它将进行最短的匹配,并为您提供最后一个数字。

doc.text_at('header.headerInfo > h4 > b').match(/(Tempo).*?(\d+)/)[2]

答案 2 :(得分:1)

您可以直接扫描数字:

"Temporada 2015".scan(/\d+/)
# => ["2015"]
"Temporada 8".scan(/\d+/)
# => ["8"]

如果要在正则表达式中包含Temp

"Temporada 2015".scan(/Temp.*?(\d+)/)
# => [["2015"]]

非正则表达方式:

"Temporada 2015".split.detect{|e| e.to_i.to_s == e }
# => "2015"
"Temporada 8".split.detect{|e| e.to_i.to_s == e }
# => "8"

答案 3 :(得分:1)

您应该添加?以使正则表达式非贪婪:

doc.text_at('header.headerInfo > h4 > b').match(/(Tempo).*?(\d+)/)[2];

以下是sample program进行验证。

答案 4 :(得分:0)

我是这样写的:

r = /
    \b    # match a word-break (possibly beginning of string)
    Tempo # match these characters
    \D+   # match one or more characters other than digits
    \K    # forget everything matched so far
    \d+   # match one or more digits
   /x

"Temporada 2015"[r] #=> 2015
"Temporada 8"[r]    #=> 8
"Temporary followed by something else 21 then more"[r]
  #=> 21

如果'Tempo'必须位于字符串的开头,请写r = /Tempo....r = /\s*Tempo...(如果前面有空格)。我假设应该至少有一个空格,我写了\D+而不是\D*

我不明白为什么'Tempo'在捕获组中。我错过了什么吗?