簡體   English   中英

紅寶石正則表達式字符串 $

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

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