記号に一致する正規表現:!$%^&*()_ + |〜-= `{} []:"; '<>?、。/


93

これらの文字のいずれかを含む文字列をテストするJavaScriptで正規表現テストを作成しようとしています。

!$%^&*()_+|~-=`{}[]:";'<>?,./

詳細情報興味​​がある場合:)

これは、私が取り組んでいるかなりクールなパスワード変更アプリケーション用です。興味がある場合のために、ここに残りのコードがあります。

パスワードの要件をリストしたテーブルがあります。エンドユーザーが新しいパスワードを入力すると、正規表現の配列がテストされ、対応するテーブルの行にチェックマークが付けられます。チェックアウトすると、チェックアウトされます:)これを追加するだけですvalidation配列の4番目の項目の代わりに。

var validate = function(password){
    valid = true;

    var validation = [
        RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password), 
        RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password), 
        !RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password), 
        !RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
    ]

    $.each(validation, function(i){
        if(this)
            $('.form table tr').eq(i+1).attr('class', 'check');
        else{
            $('.form table tr').eq(i+1).attr('class', '');
            valid = false
        }
    });

    return(valid);

}

はい、対応するサーバー側の検証もあります!


9
質問への回答がタイトルにあるのは非常に面白いです。ただし、特殊文字をエスケープし、スラッシュを囲むことは例外です。
sciritai

1
なぜ使用しない.addClass("check").removeClass("check")?そしてif (someBoolean == true)、コードで見るといつも私は不機嫌になります。ただしてくださいif (someBoolean)。または、もっと良いのは、ただやるだけです$(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;
gilly3

コードレビューの+1 @ gill3 thx-確かに素晴らしいフィードバック。私は以前、これらの簡略化された方法を使用したことがあります。
pixelbobby

@ gilly3、FFでうまく機能するようですが、!IE8です。この短縮形が大好きです。IE8の動作が異なることを理解しようとしています。
pixelbobby 2011

回答:


171

このための正規表現は非常に単純です。文字クラスを使用するだけです。ハイフンは文字クラスの特殊文字なので、最初にする必要があります。

/[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/

他の正規表現のメタ文字もエスケープする必要があります。

編集: ハイフンは、一連の文字を表すために使用できるため、特別です。これと同じ文字クラスは、次の範囲で簡略化できます。

/[$-/:-?{-~!"^_`\[\]]/

3つの範囲があります。「$」から「/」、「:」から「?」、および「{」から「〜」。文字の最後の文字列は、範囲でこれ以上単純に表すことはできません:! "^ _` []。

ACSIIテーブルを使用して、文字クラスの範囲を検索します。


文字のシーケンスをエスケープするための数量詞\ Qおよび\ Eが言及されていないのはなぜですか?
SerG 2014年

この解決策を見つける前に、文字クラスの除外ルートを調べていました。すべてに一致しますが、アルファ、数字、空白など
ピートアルビン

1
ハイフンが最初に来る必要があるというのは常識ですか?私は何十ものSOの回答と正規表現のチートシートを読みましたが、これは私が聞いた最初のものです。あなたの答えは私に多くのドラマを救いました。ありがとう!
CF_HoneyBadger

2
@SerG \Q\EJS RegExpエンジンでは機能しません:(/^\Q.\E$/.test('Q+E'); // true
Paul S.

1
@ q4w56バックスラッシュは、元の質問で指定された文字のセットに含まれていないため、バックスラッシュが一致しないことが正しいです。:)
Jeff Hillman 2017年

5

これを達成するための最も単純で最短の方法:

/[^\p{L}\d\s@#]/u

説明

[^...] 以下のリストにない単一の文字に一致します

  • \p{L} =>あらゆる言語のあらゆる種類の文字に一致します

  • \d =>ゼロから9までの数字に一致

  • \s =>あらゆる種類の不可視文字に一致

  • @# => @#文字

u(Unicode)フラグを渡すことを忘れないでください。


ないことを示すために^が必要ではないでしょうか?
ウェバー、

1
@Webberいいえ。彼らは資本の中にいるため、声明は否定的です。^我々が使用する際に必要とされる\w\s、小さな文字で。
AmirZpr

3
これは、outside wまたはoutsideのどちらかであるように解釈しませんかs。また、これら2つは実際には交差しないため、すべての文字を通過させます。(したがって、何もフィルタリングしません。)
Zael、

2
@Zaelそうです、(/[\W\S]/)の正規表現はすべてを通過させます。アミール私が信じるもののより正確な表現は次のようになりますできました[^\w\s]。前者は、正規表現は、「英数字でないマッチは何も言っているORあなたは英数字の文字が空白ではなく、その逆のため、通過させるのすべてを述べたようにこれは、空白ではないことを」。後者は「英数字でないマッチは何も言う、空白ではないことを」。もちろん、アクセント記号付きの文字(などÀ)がと一致する場合は例外が適用され[^\w\s]ます。
ジェシー

これには_ charは含まれません
MikeSchem

4

回答

/[\W\S_]/

説明

これにより、単語文字、スペース文字を削除し、アンダースコア文字を追加する文字クラスが作成されます(アンダースコアは「単語」文字であるため)。あとは特殊文字だけです。大文字は、対応する小文字の否定を表しています。

\W同等以外のすべての「単語」の文字を選択します[^a-zA-Z0-9_]
\S以外のすべての「空白」の文字と同等ように選択します[ \t\n\r\f\v]
_使用しているとき、我々はそれを否定するため、「_」を選択します\Wとバックでそれを追加する必要が


MikeSchem、あなたは私をタイムマシンに連れて行ってくれました。
pixelbobby

ええ、気づきました。古いですが、一番簡単な答えは投稿されていないと感じました。
MikeSchem

これは、下線で失敗する以下の答えとどのように違うのですか?
sf8193

はい、そうです、これを変更します
MikeSchem

-1
// The string must contain at least one special character, escaping reserved RegEx characters to avoid conflict
  const hasSpecial = password => {
    const specialReg = new RegExp(
      '^(?=.*[!@#$%^&*"\\[\\]\\{\\}<>/\\(\\)=\\\\\\-_´+`~\\:;,\\.€\\|])',
    );
    return specialReg.test(password);
  };

RegExp正規表現リテラルのみを使用できる場合は、コンストラクタを使用しないでください。エスケープ作業がはるかに少なくなり(ほとんどはとにかく不要です)、効率も向上します。
ベルギ

キャラクターを直接一致させることができるのに、なぜ複雑な先読みを使用するのですか?
ベルギ

@Bergiの例を挙げられますか?あなたの提案が理解できません。
Arni Gudjonsson

-1

これを実現する簡単な方法は、負のセット[^ \ w \ s]です。これは本質的にキャッチします:

  • 英数字以外のすべて(文字と数字)
  • スペース、タブ、または改行ではないもの(まとめて空白と呼ばれる)

何らかの理由で[\ W \ S]は同じように機能せず、フィルタリングを行いません。回答の1つに対するZaelのコメントは、説明のようなものを提供します。


いいえ、アンダースコアはなく、ASCII範囲外のすべての文字とASCII範囲内のほとんどの制御文字はこのクラスに一致します。/[^\w\s]/.test('é') # true/[^\w\s]/.test('_') # false
Casimir et Hippolyte

-7

「A」の任意の言語の後者をすべて置き換えます。たとえば、すべての桁を0にしたい場合は、次のようにします。

return str.replace(/[^\s!-@[-`{-~]/g, "A").replace(/\d/g, "0");

22
どんな質問に答えますか?
Toto
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.