[英]ruby regex string $
我必須從這樣的字符串中降低價格:
s1 = "somefing $ 100"
s2 = "$ 19081 words $"
s3 = "30$"
s4 = "hi $90"
s5 = "wow 150"
輸出應該是:
s1 = "100"
s2 = "19081"
s3 = "30"
s4 = "90"
s5 = nil
我使用以下正則表達式:
price = str[/\$\s*(\d+)|(\d+)\s*\$/, 1]
但它不適用於所有類型的字符串。
您的代碼始終返回第一個捕獲組組的結果,而在失敗的情況下,它是您感興趣的第二個捕獲組。我認為[]
方法沒有處理此問題的好方法(使用編號時捕獲組)。 你可以這樣寫
price = str =~ /\$\s*(\d+)|(\d+)\s*\$/ && ($1 || $2)
雖然這不是很清晰。 相反,如果您使用命名的捕獲組,那么您可以執行
price = str[/\$\s*(?<amount>\d+)|(?<amount>\d+)\s*\$/, 'amount']
重復命名的捕獲組不會總是做你想做的,但是當它們在單獨的交替分支中時(就像它們在這里一樣)那么它應該可以工作。
問題是你總是從第一個正則表達式組中獲得價值,而你沒有檢查第二個。 所以,你不是在關注這個案子|
- 數字在$
符號之前的那個。
如果您查看正則表達式的圖形表示,通過在方括號中鍵入1
作為第二個參數,您只覆蓋了上面的路徑(第一種情況),而永遠不會檢查下面的路徑(第二種情況)。
基本上,嘗試:
price = str[/\$\s*(\d+)|(\d+)\s*\$/, 1] or str[/\$\s*(\d+)|(\d+)\s*\$/, 2]
PS我在Ruby方面經驗不足,可能有一些更優化的輸入方式,但這應該可以解決問題
試試這個,它更簡單,但它可能不是最有效的。
p1 = s1.gsub(' ','')[/\$(\d+)|(\d+)\$/,1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.