2016-02-19 42 views
2

我無法訪問代碼,這是通過一個接口,只允許我編輯解析用戶響應的正則表達式。我需要後用戶的文本中提取的重量,他們的文字之類的東西:我需要一個正則表達式來捕獲字符串中的數字

wt 172.5 172.5 lbs 180 wt. 173.22 172,5

我需要捕捉的重量爲float場,但我想它限制爲最多1位小數。我嘗試使用/(?<val>[\d+((\.|,)\d\d?)?]/但它只能保存第一個數字「1」在現場

+1

未來,您可能希望在選擇答案之前等待一段時間。快速選擇之後可能會出現帶有問題答案的評論,可能會阻礙其他更好的答案,對於那些仍在努力解答他們的人來說,imo是不禮貌的。許多人在這裏等待至少幾個小時。關鍵是沒有急於求成。 –

+0

@CarySwoveland謝謝!新的論壇,這是有幫助的反饋 –

回答

2

有時候看起來最簡單的是沒有的。我建議使用此正則表達式:

r = /(?<=\A|\s)\d+(?:[.,]\d)?(?=\d|\s|\z)/ 

我們可以可替換地定義使用擴展自由間距模式正則表達式(由最終/之後加入改性劑x),這使我們能夠包括文檔:

r =/
    (?<=\A|\s) # match beginning of string or space in a positive lookbehind 
    \d+   # match one or more digits 
    (?:[.,]\d)? # optionally (? after non-capture group) match a . or , then a digit 
    (?=\d|\s|\z) # match a digit, space or the end of the string in a positive lookahead 
    /x 

"wt 172.5"[r]  #=> "172.5" 
"172.5 lbs"[r]  #=> "172.5" 
"180"[r]   #=> "180" 
"wt. 173.22"[r] #=> "173.2" 
"172,5"[r]   #=> "172,5" 
"A1 143.66"[r]  #=> "143.6" 
"A1 1.3.4 43.6"[r] #=> "43.6" 
+0

我喜歡它。但!那'.5'呢?您需要將您的'\ d +'更改爲'\ d *' – marklark

+0

馬克,我故意不匹配''.5',但如果您願意,您提出的更改看起來是正確的。 –

+0

謝謝,卡里。我在想的是「足夠好」的正則表達式很難,完美的正則表達式幾乎是不可能的。我只會聲稱我的解決方案力求足夠好。 – marklark

0
\d+(?:[,.]\d{1,2})? 

猜你想要這個。 []是角色類,而不是你的想法。你的角色類只捕獲你定義的所有角色中的一個角色。

查看演示。

https://regex101.com/r/eB8xU8/12

+0

謝謝!我發現有一個地方建議[]會捕獲任何內容,但是您的解決方案對於捕獲非常有用。關於將捕獲的數據限制在1個小數位的想法?我的測試183.235保存所有數字 –

+0

我不認爲這將捕獲小數點/逗號右側的數字 - 它確實捕獲多個數字的權利... – marklark

+0

@marklark請檢查演示 – vks

相關問題