2013-09-26 52 views
0

我有對價正則表達式,其中小數是可選的,像這樣,否定正則表達式價格

/[0-9]+(\.[0-9]{1,2})?/ 

現在我想要做的是得到表達的倒數,但有無法做到的。我想出了一些簡單的東西,

/[^0-9.]/g 

但是這允許多個'。'字符和小數點後2位以上的數字。我正在使用jQuery替換模糊功能來更正輸入價格字段。所以,如果在類似用戶類型,

「S $ 4sd3.24151。X45等等等等等等的文字」 或 「!#%!$ 43.24.234asdf等等等等等等文本」

它將返回

43.24

任何人都可以提供任何建議嗎?

+0

也許我們可以通過否定正則表達式來幫助您更好地完成您想要完成的實際任務?還請提供您正在使用的編程語言。 – justhalf

+0

你預期接受的字符串是什麼? – justhalf

+0

@justhalf我更新了這個問題,以便更清楚地瞭解我想要完成什麼 – LJS

回答

1

我會分兩步做。首先刪除任何非數字和非點字符。

/[^0-9.]//g 

這將分別產生的第一和第二示例43.24151.4543.24.234。 然後,您可以使用您的第一個正則表達式來匹配有效價格的第一次出現次數。

/\d(\.\d{1,2})?/ 

這樣做會給你43.24這兩個例子。

+0

這適用於我,謝謝! – LJS

0

我想在編程時,並不總是清楚「反」意味着什麼。

爲了僅根據您提供的示例提出解決方案,我將介紹一個與Vince提供的非常相似的解決方案。我很難編寫一個正則表達式,它可以匹配您需要的模式,並通過重複捕獲組捕獲可能的任意數量的數字。而且我不確定這是否可以通過某種合理的方式實現(也許是其他人的做法)。但是兩步法應該是直截了當的。

請注意,我懷疑你指的是JavaScript的替換函數,它是String對象的成員,而不是jQuery的replaceWith和replaceAll函數,指的是'jQuery替換函數'。後者是'Dom操縱'功能。但是,如果我誤解了,請糾正我。

舉個例子,基於一些假設性的輸入,你可以使用

<b>var numeric_raw = jQuery('input.textbox').attr ('value').replace (/[^0-9.]/g, "")</b> 

從文本字段不是數字或時間輸入一個值刪除所有字符; 那麼你可以使用

<b>var numeric_str = numeric_raw.replace (/^[0]*(\d+\.\d{1,2}).*$/, "$1")</b> 

這裏指定的類之間以及文斯的回答是,我包括濾波前導零的區別。 需要注意的是,在Vince的第一個註冊前,可能會有一個額外的'/' - 但也許它有一個目的,我沒有抓住。

關於「反向」,理解您的初始詢問的一種方法是您正在尋找與您提供的相反的表達方式。 注意,雖然您提供的表達式(/[0-9]+(.[0-9]{1,2})?/)確實可以將整數和小數與最多兩位小數位匹配,但它也匹配任何單個數字 - 因此,對於給定的輸入字符串,它可以識別可能不被設想的匹配。該表達式沒有錨點('^','$'),因此可能允許多個可能的匹配。例如,在字符串「1.111」中,「1.11」和「1」匹配您提供的模式。

這在我看來,一個不匹配你的模式匹配任何字符串模式如下,或至少沒有這在大多數情況下可以這樣:

/^(?:(?!.*[0-9]+(\.[0-9]{1,2})?).*)*$/ 

- 如果有人能夠識別一個正好'反向'的模式,請放心 - 我在理解如何解釋至少一些細微差別的方面有些困難。

這依賴於JavaScript這些日子支持的「負面預測」功能。您可以參考多個計算器發佈以瞭解更多信息(例如,Regular Expressions and negating a whole character group),並且可以在Internet上找到討論「向前看」和「向後看」的多種資源。

我想這個答案有一些已經給予的冗餘 - 我可能已經評論過原始海報的帖子或Vince的答案(而不是至少寫出我的答案部分),但我還沒有能夠發表評論!

+0

非常豐富,我學到了一些東西。我對正則表達式很陌生,所以我讚賞你的意見。順便說一句,我其實意味着正則表達式匹配零個,一個或兩個小數。再次感謝! – LJS