4

私はjavascript正規表現を使用してデータの検証を行い、受け入れたい文字を指定しています(英数字、スペース、および次の文字を受け入れたいです!&,'\-。必要に応じて後で追加する可能性があります)。私のコードは次のとおりです。

var value = userInput;
var pattern = /[^A-z0-9 "!&,'\-]/;
if(patt.test(value) == true) then do something

それは正常に機能し、角かっことキャレット記号を除いてユーザーに入力してほしくない文字を除外します。私が読んだすべてのjavascript正規表現チュートリアルから、それらは特殊文字です-括弧はそれらの間の任意の文字を意味し、この場合のキャレットは角括弧の間にない任意の文字を意味します. これらの文字も受け入れられる理由についての説明をこことグーグルで検索しましたが、説明が見つかりません。

私の入力が角括弧とキャレットを受け入れるのはなぜですか?

4

4 に答える 4

7

その理由は、A-Za-z ではなく Az を使用しているためです。Z (0x5a) と a (0x61) の間の ASCII 範囲には、角かっこ、キャレット、逆引用符、およびアンダースコアが含まれます。

于 2013-09-06T16:21:54.123 に答える
3

あなたの正規表現はあなたが言ったことと一致していません:

英数字、スペース、および次の !&,'\- と、必要に応じて後で追加するいくつかの文字を受け入れたい

これらの文字のみを受け入れたい場合は、キャレットを削除する必要があります。

var pattern = /^[A-Za-z0-9 "!&,'\\-]+$/;

ノート:

  1. A-z次の文字も含まれます。

    [\]^_`
    .

    修飾子を使用A-Za-zまたは使用して、iアルファベットのみに一致させます。

     var pattern = /^[a-z0-9 "!&,'\\-]+$/i;
    
  2. \--バックスラッシュはエスケープ用の特殊文字として機能するため、文字のみです。\\バックスラッシュを許可するために使用します。

  3. ^および$はアンカーであり、文字列の最初と最後を一致させるために使用されます。これにより、文字列全体が正規表現と照合されます。

  4. +文字クラスの後に使用して、複数の文字に一致させます。


受け入れる文字以外の文字を一致させたいという意味で、これを使用してユーザーが「禁止」文字を入力できないようにしている場合は、上記の最初のメモで問題が説明されています。A-Za-zの代わりに使用しますA-z(2 番目の注記も関連しています)。

于 2013-09-06T16:02:00.593 に答える
0

これを試して:var pattern = /[^\w"!&,'\\-]/;

注: \w には も含まれ_ているため、それを避けたい場合は試してください

var pattern = /[^a-z0-9"!&,'\\-]/i;

あなたの正規表現の問題は、Az が 0x41 (65) と 0x7A (122) の間のすべての文字として理解されていることだと思います。これには、AZ と az の間にある文字 []^_` が含まれます。(Z は 0x5A (90) で、a は 0x61 (97) です。これは、先行する文字が 0x5B から 0x60 までを占めることを意味します)。

于 2013-09-06T15:53:37.980 に答える