1

以下のコードでは、最初の validationPattern で messageText を検証し、validationPatterns 配列から対応するメッセージを表示します。パターンとメッセージはパイプ「|」で区切られています キャラクター。

このため、私は以下のコードを使用しており、常に間違った結果を得ています。誰かがこれを見て、私を助けることができますか?

var messageText = "Message1234";
var validationPatterns = [
    ['\/^.{6,7}$/|message one'],
    ['\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b|message two']
];
for (var i = 0; i < validationPatterns.length; i++) {
    var validationvalues = validationPatterns[i].toString();

    var expr = validationvalues.split("|")[0];
    console.log(expr.constructor);

    if(expr.test(messageText)) {
       console.log("yes");
    } else {
       console.log("no");
    }
}

パイプも正規表現の一部であるため、パイプをセパレーターとして使用できないことはわかっています。ただし、後で変更します。

4

2 に答える 2

2

検証パターンは文字列です。つまり、次のことを意味します。

  • バックスラッシュは、次の文字を文字列エスケープするだけなので食べられます。"\b"と同等"b"です。それらを二重にエスケープする必要があります:"\\b"
  • testそれらに対してメソッドを呼び出すことはできません。RegExpそれらからオブジェクトを構築する必要があります。

これを修正することは可能ですが、正規表現リテラルを使用し、それらをオブジェクト (または配列) の個別のプロパティとしてメッセージから分離した方がよいでしょう。

var inputText = "Message1234";
var validationPatterns = [
    [/^.{6,7}$/, 'message one'],
    [/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/, 'message two']
];
for (var i = 0; i < validationPatterns.length; i++) {
    var expr = validationPatterns[i][0],
        message = validationPatterns[i][1];
    console.log(expr.constructor); // RegExp now, not String

    if(expr.test(inputText)) {
       console.log(message+": yes");
    } else {
       console.log(message+": no");
    }
}
于 2013-05-28T17:04:48.727 に答える
1

あなたのexpr変数はまだ単なる文字列です(文字列validationvalues.split("|")[0]を返します)。これが、正規表現として機能しない理由です。

の初期定義の後に行を追加する必要がありexprます。

expr = new RegExp(expr, 'i');

「i」は、大文字と小文字を区別しないフラグまたはその他のフラグを使用する方法の単なる例です。大文字と小文字を区別して検索する場合は、空の文字列を使用します (既定)。

また、最初のパターンを囲んでいる/andを取り出す必要があります。/これらは、JavaScript コードで正規表現リテラルを使用する場合にのみ必要であり、文字列を正規表現に変換する場合には必要ありません。

于 2013-05-28T17:01:24.500 に答える