-1

-214748.00fromまたは-214748toの通貨数値範囲に一致する正規表現をどのように記述します214748.00か?

私はこれを試しましたが、うまくいきませんでした。

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

2 に答える 2

1

あなたが求めていることを行う正規表現は次のとおりです。

^-?((([0-9]{1,5}|1[0-9]{5}|2(0[0-9]{4}|1([0-3][0-9]{3}|4([0-6][0-9]{2}|7([0-3][0-9]|4[0-7])))))([.][0-9]{2})?)|214748([.]00)?)$

これは、0 ~ 214747 の範囲に一致する次のサブ正規表現に大きく依存しています。

([0-9]{1,5}|1[0-9]{5}|2(0[0-9]{4}|1([0-3][0-9]{3}|4([0-6][0-9]{2}|7([0-3][0-9]|4[0-7])))))

なぜ 0 から 214748 ではなく 0 から 214747 なのですか? このようにすると、214748.01 から 214748.99 (+/-) までの値の一致を回避しやすくなるためです。正規表現を分解すると、次のようになります。

^ # match start of line
 -? # optional minus sign
  ( # match one of the following groups, this one:
   (
    ([0-9]{1,5}|1[0-9]{5}|2(0[0-9]{4}|1([0-3][0-9]{3}|4([0-6][0-9]{2}|7([0-3][0-9]|4[0-7])))))
    # the sub-regex above matches the range from 0 to 214747
    ([.][0-9]{2})? # this matches the optional two decimals
   ) 

   | # or this one:
   214748([.]00)? # 214748, with optional zeroes
  ) 
$ # match end of line

これで非常に複雑な正規表現が作成されました。これは見るのも悪夢のようなものであり、維持することは言うまでもありません。範囲を変更する必要がある場合は、多くの作業が必要になります。

この怪物が、このタスクに正規表現を使用することを思いとどまらせてくれることを願っています。他の人が言うように行い、適切なツールを使用して処理します。正規表現が必要な場合は、それはひどい考えだと伝え、要件を修正するよう依頼してください。

于 2013-10-03T17:18:30.610 に答える