0

こんにちは、入力されたお金と数字を認識する正規表現を作成しようとしています。フォーマットされていない数値がプログラムで入力されることを期待しているため、数値を許可する必要があります。その後、自分でフォーマットします。何らかの理由で、私の正規表現は可能な入力として1文字を許可しています。

[\$]?[0-9,]*\.[0-9][0-9]

私の正規表現は、複数のコンマが追加され、小数点以下 2 桁が必要なケースを受け入れることを理解しています。私はすでにそれを修正する方法について考えていました。*\.私はそれを問題としておそらくに絞り込みました

編集

機能する正規表現を見つけましたが、[\$]?([0-9,])*[\.][0-9]{2}そもそもそれがどのように、またはなぜ失敗したのかはまだわかりません

を使用して.formatCurrency()、入力を通貨形式にフォーマットしています。ここで見つけることができますが、それでもアルファベット文字を使用できるため$(this).inputmask('Regex', { regex: "[\$]?([0-9,])*[\.][0-9]{2}" });、入力マスクがここ にあり$(this)、テキスト型の入力要素への参照である場所を使用してさらにマスクする必要があります。私のコードは次のようになります

<input type="text" id="123" data-Money="true">

 //in the script
 .find("input").each(function () {          
        if ($(this).attr("data-Money") == "true") {                            
            $(this).inputmask('Regex', { regex: "[\$]?([0-9,])*[\.][0-9]{2}" });
            $(this).on("blur", function () {
                $(this).formatCurrency();
            });

これが役立つことを願っています。JSfiddle を作成しようとしましたが、外部ライブラリ/プラグイン/拡張機能を追加する方法を知りました

4

2 に答える 2

3

サンプル スクリプトで使用している「正規表現」は RegExp ではありません。

$(this).inputmask('Regex', { regex: "[\$]?([0-9,])*[\.][0-9]{2}" });

むしろ、ある時点でライブラリによって次の行に沿ったものを使用して真の正規表現に変換されるパターンを含む文字列です。

var RE=!(value instanceof RegExp) ? new RegExp(value) : value;

文字列内では、バックスラッシュは、改行を表す\などの特殊文字を表すために使用されます。\nピリオドの先頭にバックスラッシュを追加すると、ピリオド\.を「エスケープ」する必要がないため、何も起こりません。

したがって、文字列から作成される RegExp にはバックスラッシュがまったく表示されません。

正規表現として文字列を指定する代わりに、JavaScript のリテラル正規表現区切り記号を使用します。

そうではなく:

$(this).inputmask('Regex', { regex: "[\$]?([0-9,])*[\.][0-9]{2}" });

使用する

$(this).inputmask('Regex', { regex: /[\$]?([0-9,])*[\.][0-9]{2}/ });

そして、あなたの「正規表現」は期待どおりに機能すると思います。

(スラッシュ/を使用してパターンを区切ることに注意してください。これは、JavaScript が真の正規表現を提供するために使用します。)

于 2013-09-05T23:35:50.607 に答える
1

まず、「[0-9]」を「\d」に置き換えることができます。したがって、最初の正規表現を次のようにもう少しきれいに書き直すことができます。

\$?[\d,]*\.\d\d

これを分解する:

\$?       - A literal dollar sign, zero or one
[\d,]*    - Either a digit or a comma, zero or more
\.        - A literal dot, required
\d        - A digit, required
\d        - A digit, required

\.\d\dこのことから、有効な文字列の最小の長さは 3 文字であることがわかります。指定した正規表現は、1 つの文字列に対して検証されることはありません。

2番目の正規表現を見ると、

[\$]?     - A literal dollar sign, zero or one
([0-9,])* - Either a digit or a comma, subexpression for later use, zero or more
[\.]      - A literal dot, required
[0-9]{2}  - A digit, twice required

これには、上記の - とまったく同じ最小一致文字列があります\.\d\d

編集:前述のように、言語によっては、文字列を処理するときにスラッシュが言語によって誤って解釈されないように、スラッシュをエスケープする必要がある場合があります。

また、余談ですが、以下の正規表現はおそらく必要なものに近いでしょう。

[A-Z]{3} ?(\d{0,3}(?:([,. ])\d{3}(?:\2\d{3})*)?)(?!\2)[,.](\d\d)\b

説明:

[A-Z]{3}       - Three letters; for an ISO currency code
 ?             - A space, zero or more; for readability
(              - Capture block; to catch the integer currency amount
  \d{0,3}        - A digit, between one and three; for the first digit block
  (?:            - Non capturing block (NC)
    ([,. ])        - A comma, dot or space; as a thousands delimiter
    \d{3}          - A digit, three; the first possible whole thousands
    (?:            - Non capturing block (NC) 
      \2             - Match 2; the captured thousands delimiter above
      \d{3}          - A digits, three
    )*             - The above group, zero or more, i.e. as many thousands as we want
  )?              - The above (NC) group, zero or one, ie. all whole thousands
)              - The above group, i.e everything before the decimal
[.,]           - A comma or dot, as a decimal delimiter
(\d{2})        - Capture, A digit, two; ie. the decimal portion
\b             - A word boundry; to ensure that we don't catch another
                 digit in the wrong place.

否定的な先読みは、この質問のジョン・クーゲルマンからの回答によって提供されました。

これは正しく一致します (角括弧で囲まれた一致):

[AUD 1.00]
[USD 1,300,000.00]
[YEN 200 000.00]
I need [USD 1,000,000.00], all in non-sequential bills.

だがしかし:

GBP 1.000
YEN 200,000
于 2013-09-05T23:25:50.853 に答える