[英]extract numbers within a string using regex
我有一個字符串如下
“天蠍座2015”
而且我得到字符串
“天婦羅8”
我只需要從字符串2015和8中匹配並提取數字。我該如何使用正則表達式呢? 我嘗試如下
doc.text_at('header.headerInfo > h4 > b').match(/(Tempo).*(\d+)/)[2]
但是它的第一個只返回了5,而不是2015。我如何匹配兩者,只返回不。
.*
是“貪婪的”。 它匹配盡可能多的字符。 因此, \\d+
只剩下一位。
如果您的字符串不包含其他數字,則可以
.scan(/\d+/).first
否則,您只能匹配非數字
.match(/(Tempo)[^\d]*(\d+)/)[2]
因為.*
是貪婪的字符,它會盡可能匹配所有字符,因此它會返回與所有先前字符貪婪匹配的最后一個數字。 通過將貪婪.*
變成非貪婪.*?
,它將進行最短的匹配,從而為您提供最后一個數字。
doc.text_at('header.headerInfo > h4 > b').match(/(Tempo).*?(\d+)/)[2]
您可以直接掃描數字:
"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"
您應該添加一個?
使正則表達式不貪心:
doc.text_at('header.headerInfo > h4 > b').match(/(Tempo).*?(\d+)/)[2];
這是用於驗證的示例程序 。
我這樣寫:
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'
在捕獲組中。 我錯過了什么嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.