2016-07-22 46 views
2

我正在尋找一個可以驗證非負數的decimal(.NET類型)的正則表達式,即如果可以使用decimal.Parse(...)解析非負值,那麼應該認爲它是有效的。否則無效。正則表達式來驗證.NET的非負十進制或空白?

我很好,如果它沒有通過28-29位有效數字驗證 - 依靠用戶的理智 - 然後我們有另一個驗證層,無論如何都會接收它。

這裏是我想出了:

^(?:[1-9]\d*|0)?(?:\.\d+)?$ 

問題是,它拒絕1.這是一個有效的數字(你可以在VS立即窗口驗證)。可能是其他邊緣情況,我沒有測試。請指教。

P.S.我包含ASP.NET和C#標記,因爲這是用C#編寫的Web應用程序,其中這個正則表達式被傳遞給第三方組件,然後在客戶端(即JS)上工作,所以我不能輕鬆地將自定義代碼那裏(即decimal.TryParse或者那樣)。

+0

'decimal.Parse'也接受一家領先的標誌。 '「+1」是一個可以解析的非負值。所以''-0「',甚至。 'decimal.Parse'還可以接受數千個分隔符:'「1,000」'可以被解析。 'decimal.Parse'是文化敏感的,所以'''不應該被硬編碼,除非文化是一樣的。 'decimal.Parse'接受空格。 '「100」'可以被解析。我可能錯過了更多。 – hvd

+0

@ hvd,是的,我明白,謝謝你提到那些邊緣情況。我不試圖做到100%完美,只是試圖覆蓋99.9%的測試用例。還有一些培訓可以確保人們不會在用戶界面上發瘋。如果你真的想要的話,我肯定總能打破任何程序。 – Neolisk

+0

@ hvd,btw +1測試用例由接受的答案處理。 – Neolisk

回答

3

您可以使用基於負前瞻這個正則表達式來避免匹配單點:

^(?!\D+$)\+?\d*?(?:\.\d*)?$ 
  • (?!\D+$)是負先行斷言失敗時輸入非數字字符
  • ?:\.\d*)?允許匹配123.數字的類型。

RegEx Demo 1

RegEx Demo 2

+0

感謝 - 基本測試用例似乎工作正常。你能不能也請加上對前導零的支持,比如001,以及加號被明確指定的情況,比如+100? – Neolisk

+1

更正 - 它接受一個純粹的+符號,顯然不是一個數字。 – Neolisk

+0

Yes use:['^(?!\ D + $)\ +?\ d *?(?:\。\ d *)?$'](https://regex101.com/r/iB1hM8/3) – anubhava