1

32.4554支出額( 、、など)の有効なエントリを持つためのコードをたくさん書きました234,324.34。さらに、ユーザーが13桁を超える数字(.およびを除く,)を入力できないようにコードを記述しました。

これらはすべてFirefoxで完全に機能します。しかし、IE 8では、桁数が13を超えた後、文字を入力すると、Internet Explorerがハングしてクラッシュします!デバッグ中に、正規表現の行で障害が発生していることに気付きましたが、13の制限を超えない限り、同じ正規表現は正常に機能します。専門家の皆さん、お願いします!光を見せて!

function isIncorrectSpend(cubeCurrencySpend) {  
    if(!(/^([1-9]*[0-9]*,?[0-9]*)* (\.[0-9]*)?$/.test(cubeCurrencySpend))) {
        return true;
    }
    return false;
}

function isLongerThanThirteenDigits(cubeCurrencySpend) {
    cubeCurrencySpend = cubeCurrencySpend.replace(/,/g, "").replace(/\./g, "");
    if(cubeCurrencySpend.length>12) { 
        return true;
    }
    return false;
}

jQuery("input#minval").keyup( function() {
    if(isIncorrectSpend(jQuery("input#minval").val())) {
        jQuery("input#minval").val("");
        alert("please enter correct spend value");
    }        
});
jQuery("input#minval").keypress( function(e) {
    var code = (e.keyCode ? e.keyCode : e.which);
    if(isLongerThanThirteenDigits(jQuery("input#minval").val()) && (code > 47 && code < 58)) {
        alert("Please enter a number less than 13 digits");
        return false;
    }
    return true;
});
4

3 に答える 3

5

これは壊滅的なバックトラックのケースであると確信しています。正規表現には、失敗するまでチェックする可能性が多すぎます。

問題はこの部分です

([1-9]*[0-9]*,?[0-9]*)*

そして、私はそれがあなたが期待することをしていないと確信しています。

これは同じものと一致しますが、はるかに速く失敗します:

/^[1-9]*[0-9,]*(\.[0-9]+)?$/

それでも1、、、、、、、。123のようなものを許可していますが、あなたのものよりはるかに優れています。そのようなことを禁止したい場合は、要件を明確にする必要があります。

于 2012-11-14T10:59:42.133 に答える
0

長さと妥当性チェックの両方を組み合わせるように正規表現を変更することもできます。

function isIncorrectSpend(cubeCurrencySpend) {  
     return !/^(?!0)(?:\d[,\.]*){1,13}$/.test(cubeCurrencySpend);              
}
于 2012-11-14T11:08:06.613 に答える
0

この回答は、次の基準を満たす10進数の「数値」を検証することを前提としています。

「数」の定義

  • 少なくとも1桁で、すべての桁が10進数(0から9)である必要があります。
  • 整数部分と小数部分はどちらもオプションですが、どちらか一方が存在する必要があります。
  • 小数部分は、存在する場合、任意の桁数にすることができますが、常に小数点が前に付きます。
  • 整数部分に複数の桁がある場合、先頭の桁はゼロであってはなりません。
  • 整数部分が3桁を超える場合は、コンマを使用して整数を3桁の数字に区切ることができます。
  • +数字は、プラスまたはマイナスのいずれかのオプションの記号で始めることができます-
  • 空白は許可されていません。
  • 指数部分は許可されていません。

上記の要件を考えると、ここにいくつかの有効な番号と無効な番号があります

有効な「番号」:

0
0.
.0
0.0
1
+1
-1
1234
123456
1,234
12,345
123,456
123,456.7890

無効な「数字」:

0FA92      // Invalid digit. Must be 0-9.
0123       // Multi-digit integer must lead with non-zero.
.          // Must have at least one digit.
1,23,4     // Commas must separate triplets of digits.
12345,678. // Missing comma.
+  10      // Whitespace not allowed.
1.2E34     // Exponents not allowed.

上記の要件を満たす数値に一致する正規表現(Pythonの便利な生の文字列構文を使用したコメント付きのフリースペースモード形式で最初に表示されます)は次のとおりです。

「番号」を検証するための正規表現

r"""
^          # Anchor to start of string.
[+\-]?     # Optional sign.
(?=\.?\d)  # Must have at least one digit.
(?:        # Optional integer part. Either...
  [1-9]    # A sequence of digits w/no commas.
  \d*      # (but first digit is not zero.)
|          # or an integer having commas...
  [1-9]    # First digit is not zero.
  \d{0,2}  # 1,2 or 3 digits ahead of 1st comma.
  (?:      # One or more comma + 3 digits.
    ,      # Comma separates
    \d{3}  # digit triplets.
  )+       # One or more comma + 3 digits.
| 0        # or integer part may be just zero.
)?         # Optional integer part.
(?:        # Optional fractional part.
  \.       # Dot separates
  \d*      # zero or more fraction digits.
)?         # Optional fractional part.
$          # Anchor to end of string.
"""

上記の正規表現を実装するJavaScript関数は次のとおりです。

関数isValidNumber()

function isValidNumber(text) {
    var re = /^[+\-]?(?=\.?\d)(?:[1-9]\d*|[1-9]\d{0,2}(?:,\d{3})+|0)?(?:\.\d*)?$/;
    if((re.test(text))) return 'true';
    return 'false';
}

ユーザーが番号全体の入力を完了するまで、番号の検証を試みるべきではないことに注意してください。キーを押すたびに検証関数を呼び出すことは(上記のコードが実行しているように見えるため)、私見ではお勧めできません。

于 2012-11-14T18:10:08.483 に答える