source

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

manysource 2023. 8. 13. 09:49

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

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

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

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

제가 하고 있는 꽤 멋진 비밀번호 변경 애플리케이션을 위한 것입니다.만약 당신이 관심이 있다면 여기 나머지 코드가 있습니다.

암호 요구 사항을 나열하는 테이블이 있는데 최종 사용자가 새 암호를 입력할 때 정규식 배열을 테스트하고 다음과 같은 경우 해당 테이블 행에 체크 표시를 합니다.체크아웃 :) 저는 단지 이것을 4번째 항목 대신에 추가하면 됩니다.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);

}

예, 해당 서버 측 검증도 있습니다!

이것에 대한 정규 표현은 정말 간단합니다.그냥 문자 클래스를 사용합니다.하이픈은 문자 클래스에서 특수 문자이므로 먼저 입력해야 합니다.

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

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

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

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

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

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

정답.

/[\W\S_]/

설명.

이렇게 하면 단어 문자, 공백 문자를 제거하고 밑줄 문자를 다시 추가하는 문자 클래스가 만들어집니다(언더스코어는 "단어" 문자).남은 것은 특별한 캐릭터들뿐입니다.대문자는 소문자의 부정을 나타냅니다.

\W다음과 동일한 "단어"가 아닌 모든 문자를 선택합니다.[^a-zA-Z0-9_]
\S다음과 동일한 "공백" 문자가 아닌 모든 문자를 선택합니다.[ \t\n\r\f\v]
_"_"를 선택합니다. 왜냐하면 우리는 그것을 사용할 때 부정하기 때문입니다.\W그리고 그것을 다시 추가해야 합니다.

이를 위한 가장 간단하고 빠른 방법은 다음과 같습니다.

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

설명.

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

  • \p{L}=> 모든 언어의 문자와 일치합니다.

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

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

  • @# =>@그리고.#성격.

패스하는 것을 잊지 마세요.u깃발

이를 달성하는 간단한 방법은 음수 집합 [^\w\s]입니다.이는 기본적으로 다음과 같습니다.

  • 영숫자(문자 및 숫자)가 아닌 모든 문자
  • 공백, 탭 또는 줄 바꿈이 아닌 모든 항목(일반적으로 공백이라고 함)

어떤 이유에서인지 [\W\S]는 동일한 방식으로 작동하지 않으며 필터링도 수행하지 않습니다.답변 중 하나에 대한 자엘의 논평은 설명을 제공합니다.

// 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);
  };

@prefix-hillman 답변을 기반으로, 이것은 완전한 버전입니다.

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

테스트

function noSpecialChars(str) {
  const match = str.match(/[\\@#$-/:-?{-~!"^_`\[\]]/)
  if (!match) return
  
  throw new Error("got unsupported characters: " + match[0])
}

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

symbols.forEach((s) => {
  it(`validates no symbol ${s}`, async () => {
    expect(() => {
      noSpecialChars(s)
    }).toThrow();
  })
})

어때는 요?(?=\W_)(?=\S).문자가 일치하는지 확인합니다..문자가 . (단, 단문단다아니닙가자어단(,다▁(,_공백이 아님을 나타냅니다.

참고: @Casimir et Hippolyte가 다른 댓글에서 지적했듯이, 이것은 또한 é와 같은 문자와 일치할 것입니다.이러한 캐릭터를 기대하지 않는다면 이것이 효과적인 해결책입니다.

언급URL : https://stackoverflow.com/questions/8359566/regex-to-match-symbols