2016-04-23 17 views
1

だから私はビーイングを合わせるため正規表現:非キャプチャグループに基づく結果を除外しますか?

制約(ここではSO上の別の質問から派生)有効価格

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

のパターンに一致するように、次の正規表現を使用しようとしている:

  1. $1.00 <= price <= $999,999.99
  2. 小数点以下の桁数は不要です($1はとして有効です)。)
  3. シングル桁ポスト小数点以下が無効である($1.1$2.9、等。)
  4. 3+桁が

$1.111$2.999、等。)小数点以下が無効である上記のパターンを投稿最初の2つの制約は処理しますが、他の制約は処理しません。問題は、(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

Easy! ([^,.\d$]|$)を最後に追加するだけで、Regexパーサーは、数字、コンマ、ポイント、またはドルが一番近くまで動作するようになります。またはすでに文字列の最後にある。

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

Demo

+0

それを作るための方法はあります価格が必ずしも空白で区切られていない場合はどうすればよいですか? 1つの価格が終わり、次の商品に直接流れ込むように? – Scherf

+0

すでに回答を更新しました。 –

+0

を確認してください。次の価格のドル記号$が前回の試合で消費されたため、何らかの不具合が発生します。 – gdlmx

関連する問題