2016-04-23 88 views
1

所以我嘗試使用下面的正則表達式匹配的有效價格正則表達式:排除基於非捕獲組的結果?

^\$[1-9]\d{0,2}(?:\,\d{3})?(?:\.\d{2})? 

(從另一個問題在這裏得到的對SO)

約束匹配福利模式:

  1. $1.00 <= price <= $999,999.99
  2. 不需要小數位($1有效,因爲是$1.00
  3. 單位後的小數位無效($1.1$2.9,等等。)
  4. 3+位數後小數位無效($1.111$2.999,等等。)

上述圖案努力處理前兩個約束,但不處理其他約束。問題是,在(3)(4)的情況下,小數點前的價格部分是匹配的。

例:

$100,000.4 matches to $100,000 
$200,000.444 matches to $200,000.44 

我如何在的情況下修改此使(3)(4)整個字符串不匹配?

回答

2

您可以使用否定先行(?![\d.,])斷言有以下匹配的價格沒有數字,逗號或點:

\$[1-9]\d{0,2}(?:,\d{3})?(?:\.\d{2})?(?![\d.,]) 

Regex 101 demo.

3

簡單!最後只需添加([^,.\d$]|$)即可,因此正則表達式解析器應該工作到最近的不是數字,逗號,點或美元。或者它已經在字符串的末尾。

^\$[1-9]\d{0,2}(?:\,\d{3})?(?:\.\d{2})?([^,.\d$]|$) 

Demo

+0

是否有辦法使它工作,如果價格不一定由空白分開?就像一個價格結束並直接流入下一個? – Scherf

+0

當然!已經更新了答案。請查看 –

+0

由於下一個價格的美元符號$被以前的匹配消耗,它將錯過一些事件。 – gdlmx