2012-07-16 220 views
3

我有一個字符串,如:正則表達式來查找字符串整數和小數

$str1 = "12 ounces"; 
$str2 = "1.5 ounces chopped; 

我想從字符串是否是小數或沒有(12或1.5)獲得的金額,然後抓住前一次測量(盎司)。

我能夠使用一個非常基本的正則表達式來獲取測量結果,但獲取小數點/整數給我帶來了問題。

感謝您的幫助!

+1

你會允許哪種小數的?是'1.'還是'.5'好嗎?你需要允許數千個分離器('1,000 ml')嗎?其他小數點標點符號(歐洲:1,0升)? – 2012-07-16 08:22:50

回答

11

如果你只是想獲取數據,你可以只使用一個鬆散的正則表達式:

([\d.]+)\s+(\S+) 
  • ([\d.]+)[\d.]+將匹配的嚴格的數字和.(這意味着4.5.6....將序列匹配,但這些情況並不常見,這僅用於抓取數據),括號表示我們將捕獲匹配的文本。 .這裏是字符類[],所以不需要轉義。

  • 後跟非空格字符的任意空間\s+和最大序列(由於貪婪量詞)\S+(非空間真的是無空間:它會以Unicode幾乎所有的匹配,除了空格,製表符,新行,回車符)。

您可以得到第一個捕獲組中的編號和第二個捕獲組中的單元。

您可以在數更嚴格一點:

(\d+(?:\.\d*)?|\.\d+)\s+(\S+) 
  • 唯一的變化是(\d+(?:\.\d*)?|\.\d+),所以我只說明這一部分。這有點嚴格,但是根據輸入域和您的要求,是否更嚴格。它將匹配整數34,數字帶有小數部分3.40000,並允許.534.個案通過。它會拒絕超過.的號碼,或僅包含.|作爲OR分開2種不同模式:\.\d+\d+(?:\.\d*)?
  • \d+(?:\.\d*)?:這將匹配和(隱含地)斷言在整數部分的至少一個位,隨後可選.(其需要與\因爲.指任何字符被轉義)和小數部分(其可以是0或更多數字)。最終選擇性由?表示。 ()可用於分組和捕獲 - 但如果不需要捕獲,則可使用(?:)禁用捕獲(節省內存)。
  • \.\d+:這將匹配案例,如.78。它匹配.後跟至少一個(由+表示)數字。

這不是一個好的解決方案,如果你想確保你從輸入字符串中獲得有意義的東西。在編寫只捕獲有效數據的正則表達式之前,您需要定義所有的預期單位。

+0

謝謝,這正是我一直在尋找的。如果你有機會,那麼你的正則表達式究竟發生了什麼的細分會對我有所幫助。再次感謝! – HWD 2012-07-16 20:39:58

+0

很好的解釋。一個有用的答案! – HWD 2012-07-17 17:53:54

0

使用正則表達式\b\d+([\.,]\d+)?

0

爲了得到整數和小數,要麼使用逗號或點加一個字,請使用以下的正則表達式:

/\d+([\.,]\d+)?\s\S+/ 
相關問題