기호와 일치하는 정규식 :! $ % ^ & * () _ + | ~-=`{} [] : "; '<>?,. /


95

다음 문자를 포함하는 문자열을 테스트하는 JavaScript에서 Regex 테스트를 만들려고합니다.

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

관심이 있다면 더 많은 정보 :)

제가 작업중인 아주 멋진 암호 변경 응용 프로그램입니다. 관심이있는 경우 나머지 코드는 여기에 있습니다.

암호 요구 사항을 나열한 테이블이 있고 최종 사용자가 새 암호를 입력하면 정규식 배열을 테스트하고 해당 테이블 행에 체크 표시를합니다. 체크 아웃합니다. :)이 항목을 추가하면됩니다. validation배열 의 네 번째 항목 대신 .

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 2011

+1 @ gill3 코드 검토를 위해 thx-정말 좋은 피드백. 나는 과거에 그 속기 방법을 사용했습니다.
pixelbobby 2011

@ gilly3, FF에서는 잘 작동하지만! IE8. 이 속기를 좋아하십시오. IE8이 다르게 무엇을하고 있는지 알아 내려고합니다.
pixelbobby 2011

답변:


173

이것에 대한 정규식은 정말 간단합니다. 문자 클래스를 사용하십시오. 하이픈은 문자 클래스의 특수 문자이므로 첫 번째 여야합니다.

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

다른 정규식 메타 문자도 이스케이프해야합니다.

편집 : 하이픈은 문자 범위를 나타내는 데 사용할 수 있으므로 특별합니다. 이 동일한 문자 클래스는 다음과 같은 범위로 단순화 할 수 있습니다.

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

세 가지 범위가 있습니다. '$'에서 '/'로, ':'에서 '?'로, '{'에서 '~'로. 마지막 문자열은! "^ _`[] 범위로 더 간단하게 표현할 수 없습니다.

ACSII 테이블 을 사용하여 문자 클래스의 범위를 찾습니다.


문자 시퀀스를 이스케이프하기 위해 \ Q 및 \ E를 언급하지 않는 이유는 무엇입니까?
SerG 2014 년

이 솔루션을 찾기 전에 저는 문자 클래스 제외 경로를 내려갔습니다. 알파벳, 숫자, 공백 등을 제외한 모든 항목을 일치시킵니다.
Pete Alvin

1
하이픈이 먼저 와야한다는 것이 상식입니까? 나는 수십 개의 SO 답변과 정규식 치트 시트를 읽었으며 이것은 내가 들어 본 첫 번째입니다. 당신의 대답은 저에게 많은 드라마를 구했습니다. 감사!
CF_HoneyBadger

2
@SerG \Q\EJS에서 작동하지 않습니다 정규식 :( 엔진/^\Q.\E$/.test('Q+E'); // true
폴 S.

1
@ q4w56 백 슬래시는 원래 질문에 지정된 문자 집합에 없으므로 백 슬래시와 일치하지 않는 것이 맞습니다. :)
Jeff Hillman

7

이를 수행하는 가장 간단하고 짧은 방법 :

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

설명

[^...] 아래 목록에없는 단일 문자와 일치

  • \p{L} => 모든 언어의 모든 종류의 문자와 일치

  • \d => 0에서 9까지의 숫자와 일치

  • \s => 모든 종류의 보이지 않는 문자와 일치

  • @# => @#문자

u(unicode) 플래그 를 전달하는 것을 잊지 마십시오 .


그렇지 않다는 것을 나타 내기 위해 ^가 필요하지 않습니까?
Webber

1
@Webber 아니오. 그들은 자본에 있고 이것은 진술을 부정적으로 만듭니다. ^우리가 사용할 때 필요하다 \w\s소문자에.
AmirZpr

3
이것은 외부 w또는 외부 중 하나를 해석하지 않습니까?이 s두 가지가 실제로 교차하지 않기 때문에 모든 문자를 통과하도록 허용합니까? (따라서 아무것도 필터링하지 않습니다.)
Zael

2
@Zael 당신 말이 맞습니다. ( /[\W\S]/) 정규식 은 모든 것을 통과시킵니다. 내가 아미르가 얻는 것의 더 정확한 표현이 될 것입니다 [^\w\s]. 전자에서 정규 표현식은 "영숫자가 아니 거나 공백 이 아닌 모든 항목과 일치"라고 말하고 있습니다. 언급했듯이 영숫자는 공백이 아니고 그 반대의 경우도 마찬가지입니다. 후자는 "숫자 아닌 일치 아무것도 말한다 공백없는 것을". 물론 악센트 부호가있는 문자 (예 :)가와 À일치하는 경우에는 예외가 적용 됩니다 [^\w\s].
Jesse

이것은 _ char
MikeSchem

5

대답

/[\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

캐릭터를 직접 일치시킬 수 있는데 왜 복잡한 예견을 사용합니까?
Bergi

@Bergi의 예를 들어 줄 수 있습니까? 나는 당신이 제안하는 것을 이해하지 못합니다.
Arni Gudjonsson

-1

이를 달성하는 간단한 방법은 음수 세트 [^ \ w \ s]입니다. 이것은 본질적으로 다음을 포착합니다.

  • 영숫자가 아닌 모든 것 (문자 및 숫자)
  • 공백, 탭 또는 줄 바꿈이 아닌 모든 항목 (통칭하여 공백이라고 함)

어떤 이유로 [\ W \ S]는 같은 방식으로 작동하지 않으며 어떤 필터링도 수행하지 않습니다. 답변 중 하나에 대한 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");

23
어떤 질문에 대답하고 있습니까?
Toto
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.