簡體   English   中英

使用正則表達式提取字符串中的數字

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM