5

これが整数では機能せず、文字では機能する理由を誰か教えてもらえますか? 正規表現は不可解なので本当に嫌いですが、もしそうならそうします。また、「-()」も有効な文字に含めたいと思います。

String.prototype.Contains = function (str) {  
    return this.indexOf(str) != -1;
};

var validChars = '0123456789';               

var str = $("#textbox1").val().toString();
if (str.Contains(validChars)) {
    alert("found");
} else {
    alert("not found");
}
4

5 に答える 5

4

レビュー

String.prototype.Contains = function (str) {  
    return this.indexOf(str) != -1;
};

この文字列「メソッド」はstr、'hello world'.indexOf('world') != -1 would returntrue` のように、それ自体に含まれている場合に true を返します。

var validChars = '0123456789';               

var str = $("#textbox1").val().toString();

の値$('#textbox1').val()はすでに文字列であるため、.toString()ここでは必要ありません。

if (str.Contains(validChars)) {
    alert("found");
} else {
    alert("not found");
}

ここで問題が発生します。事実上、これは実行され'1234'.indexOf('0123456789') != -1ます。falseのような膨大な数がない限り、ほとんどの場合返されます10123456789

あなたができることは、各文字がの中にstr含まれているかどうかをテストすることです。ただし、はるかに簡単に実行できます。'0123456789''0123456789'.indexOf(c) != -1cstr

解決

あなたが正規表現を好まないのは承知していますが、次のような場合に非常に役立ちます。

if ($("#textbox1").val().match(/^[0-9()]+$/)) {
   alert("valid");
} else {
   alert("not valid");
}

説明

[0-9()]0-9は、 for の略である範囲と0123456789括弧で構成される文字クラス()です。

[0-9()]+上記の文字クラスに一致する少なくとも 1 つの文字に一致します。

^[0-9()]+$すべての文字が文字クラスに一致する文字列に一致します。^および$文字列の先頭と末尾にそれぞれ一致します。

/最後に、正規表現の区切り文字である で、式全体の両側がパディングされます。の略ですnew RegExp('^[0-9()]+$')

于 2012-12-18T08:05:18.633 に答える
1

のリスト全体をvalidCharstoに渡していindexOf()ます。文字をループして、1 つずつ確認する必要があります。

デモ

String.prototype.Contains = function (str) {  

  var mychar;
  for(var i=0; i<str.length; i++)
  {
    mychar = this.substr(i, 1);
    if(str.indexOf(mychar) == -1)
    {
        return false;
    }
  }

  return this.length > 0;
};

これを整数で使用するには、次のように を使用して整数を文字列に変換できますString()

var myint = 33; // define integer
var strTest = String(myint); // convert to string
console.log(strTest.Contains("0123456789")); // validate against chars
于 2012-12-18T08:02:07.140 に答える
1

validCharsパラメータを考慮して、入力を検証する関数を探していると仮定します。

String.prototype.validate = function (validChars) {  
    var mychar;
    for(var i=0; i < this.length; i++) {
        if(validChars.indexOf(this[i]) == -1) { // Loop through all characters of your string.
            return false; // Return false if the current character is not found in 'validChars' string.
        }
    }
    return true;
};

var validChars = '0123456789';

var str = $("#textbox1").val().toString();
if (str.validate(validChars)) {
    alert("Only valid characters were found! String validates!");
} else {
    alert("Invalid Char found! String doesn't validate.");
}

ただし、これは文字列検証用のかなりの負荷のコードです。代わりに、正規表現を調べることをお勧めします。(ジャックはここでいい答えを持っています)

于 2012-12-18T08:09:32.107 に答える
0

回答ありがとうございます!正規表現を使用するようです。私はこれらすべての解決策を試しましたが、validCharsの文字列を渡すことができるようにしたかったのですが、代わりに正規表現を渡します。

これは単語、文字には機能しますが、整数には機能しません。整数では機能しない理由を知りたいと思いました。textBoxのカスタム属性を使用して、MVCのajaxコントロールツールキットからFilteredTextBoxExtenderを模倣できるようにしたかったのです。

于 2012-12-18T16:03:49.967 に答える
0

推測ですが、電話番号を確認しようとしているようです。関数を変更する簡単な方法の 1 つは、文字列値を RegExp でチェックすることです。

String.prototype.Contains = function(str) {
    var reg = new RegExp("^[" + str +"]+$");
    return reg.test(this);
};

ただし、文字列内のシンボルのシーケンスはチェックしません。

電話番号の確認はより複雑なので、RegExp はこれを行うのに適した方法です (たとえそれが気に入らなくても)。次のようになります。

String.prototype.ContainsPhone = function() {
    var reg = new RegExp("^\\([0-9]{3}\\)[0-9]{3}-[0-9]{2}-[0-9]{2}$");
    return reg.test(this);
};

この亜種は、 のような電話をチェックし"(123)456-78-90"ます。文字のリストをチェックするだけでなく、文字列内のシーケンスもチェックします。

于 2012-12-18T08:22:38.530 に答える