我有一个字符串,如下所示
“Temporada 2015”
我也得到字符串
“Temporada 8”
我需要匹配并仅提取字符串2015和8中的数字。 我如何使用正则表达式来做到这一点。我尝试过如下
doc.text_at('header.headerInfo > h4 > b').match(/(Tempo).*(\d+)/)[2]
但是第一次而不是2015年只返回了5次。 我如何匹配两者并仅返回nos。??
答案 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'
在捕获组中。我错过了什么吗?