본문 바로가기
JavaScript/JavaScript

Javascript) 정규표현식(4) - 수량자(*, +, ?, {}), Look Around, 비밀번호 유효성 검사

by 박채니 2022. 5. 31.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


수량자 (Quantifier)

- * + ?

 

HTML 코드

<button id="btn10">수량자 * + ?</button>
<button id="btn11">수량자 {}</button>
<div class="area" id="area10"></div>

 

Javascript 코드

 

a*

- a가 0개 이상

const SUBSTITUETE = "<mark>$&</mark>";

btn10.onclick = () => {
    const str = "aabc abc bc";

    area10.innerHTML = `${str.replace(/a*b/g, SUBSTITUETE)}<br>`;
};

a가 0개 이상 뒤에 b가 나오는 단어들을 매칭하였으므로 a가 2개인 'aab', a가 1개인 'ab', a가 0개인 'b'가 마킹처리 되었습니다.

 

a+

- a가 한 개 이상 일 때

const SUBSTITUETE = "<mark>$&</mark>";

btn10.onclick = () => {
    const str = "aabc abc bc";

    area10.innerHTML += `${str.replace(/a+b/g, SUBSTITUETE)}<br>`;
};

a가 한 개 이상이고 뒤에 b가 나오는 단어들을 매칭하였으므로 a가 2개인 'aab', a가 1개인 'ab'가 마킹 처리 되었습니다.

a가 없는 'bc'는 해당되지 않으므로 마킹 처리 되지 않았습니다.

 

a?

- a가 0 혹은 1개

const SUBSTITUETE = "<mark>$&</mark>";

btn10.onclick = () => {
    const str = "aabc abc bc";

    area10.innerHTML += `${str.replace(/a?b/g, SUBSTITUETE)}<br>`;
};

a가 0개 혹은 1개이고 뒤에 b가 나오는 단어들을 매칭하였으므로 a가 1개인 'aabc'에서 'ab', a가 1개인 'ab', a가 0개인 'b'가 마킹처리 되었습니다.

 

@실습

1) a로 시작하고 z로 끝나는 문자열 검사

const regexp = /^a.*z$/; 

console.log("abcdefz", regexp.test("abcdefz"));
console.log("a*z", regexp.test("a*z"));
console.log("az", regexp.test("az"));
console.log("abc", regexp.test("abc"));
console.log("xyz", regexp.test("xyz"));
console.log("안a하b이c녕z", regexp.test("안a하b이c녕z"));

 

2) 영문자만으로 이루어진 문자열 검사

const regexp2 = /^[a-z]+$/i;

console.log("abcde", regexp2.test("abcde"));
console.log("a", regexp2.test("a"));
console.log("", regexp2.test(""));
console.log("123", regexp2.test("123"));
console.log("abc123", regexp2.test("abc123"));
console.log("abc123a", regexp2.test("abc123a"));

 


수량자 (Quantifier)

- { }

 

Javascript 코드

 

a{2, }

- a가 2개 이상

const SUBSTITUETE = "<mark>$&</mark>";

btn11.onclick = () => {
    const str = "aa aba abba abbba";

    area10.innerHTML = `${str.replace(/ab{0,}a/g, SUBSTITUETE)}<br>`;
    area10.innerHTML += `${str.replace(/ab{1,}a/g, SUBSTITUETE)}<br>`;
}

ab가 0개 이상 뒤에 a가 있는 문자열을 매칭 했으므로 모든 문자열이 마킹 처리가 되었습니다.

ab가 1개 이상 뒤에 a가 있는 문자열을 매칭 했으므로 'aa'를 제외한 모든 문자열이 마킹 처리가 되었습니다.

 

*와 + 로도 표현 가능

area10.innerHTML += `${str.replace(/ab*a/g, SUBSTITUETE)}<br>`;
area10.innerHTML += `${str.replace(/ab+a/g, SUBSTITUETE)}<br>`;

 

a{2, 5}

- a가 2개 이상 5개 이하

const SUBSTITUETE = "<mark>$&</mark>";

btn11.onclick = () => {
    const str = "aa aba abba abbba";

    area10.innerHTML += `${str.replace(/ab{0,1}a/g, SUBSTITUETE)}<br>`;
}

ab가 0개~1개 이상 뒤에 a가 있는 문자열을 매칭했으므로 'aa', 'aba'가 마킹 처리 되었습니다.

 

? 로도 표현 가능

area10.innerHTML += `${str.replace(/ab?a/g, SUBSTITUETE)}<br>`;

 

a{3}

- a가 3개

const SUBSTITUETE = "<mark>$&</mark>";

btn11.onclick = () => {
    const str = "aa aba abba abbba";

    area10.innerHTML += `${str.replace(/ab{1}a/g, SUBSTITUETE)}<br>`;
}

ab가 1개 있고 뒤에 a가 있는 문자열을 매칭했으므로 'aba'가 마킹 처리 되었습니다.

 

@실습

1) 4자리 숫자로 이루어진 비밀번호 검사

const regexp1 = /^\d{4}$/;

console.log("1234", regexp1.test("1234")); // true
console.log("123456", regexp1.test("123456"))// false
console.log("abcd", regexp1.test("abcd")); // false
console.log("12", regexp1.test("12")); // false
console.log("가나다라", regexp1.test("가나다라")); // false

 

2) 숫자 한자리로 시작하고 영문자가 3개 이상 나오고, .으로 끝나는 문자열 검사

const regexp2 = /^\d[a-z]{3,}\.$/i;

console.log("9abcdefg.", regexp2.test("9abcdefg.")); // true
console.log("9abc.", regexp2.test("9abc.")); // true
console.log("100", regexp2.test("100")); // false
console.log("1가나다", regexp2.test("1가나다")); // false
console.log("123abc가나다.", regexp2.test("123abc가나다.")); // false

 


Look Around

- 검사만 실시하고 최종 결과에는 포함되지 않음

 

HTML 코드

<button id="btn12">Look Around</button>
<div class="area" id="area12"></div>

 

Javascript 코드

 

① Look Ahead

a(?=b)

- b가 뒤따르는 a를 조회

const SUBSTITUETE = "<mark>$&</mark>";
    
btn12.onclick = () => {
    const str1 = 'hello world hello Tom hello Jane';
    
    area12.innerHTML = `${str1.replace(/hello(?= world)/g, SUBSTITUETE)}<br>`;
};

(?=)를 이용하여 ' world'가 뒤따르는 hello를 찾아 마킹 처리 하였습니다.

' world'에 대해서는 검사만 실시하고 최종 결과에는 포함 되지 않는 것을 확인할 수 있습니다.

 

a(?!b)

- b가 뒤따르지 않는 a를 조회

const SUBSTITUETE = "<mark>$&</mark>";

btn12.onclick = () => {
    const str1 = 'hello world hello Tom hello Jane';

    area12.innerHTML += `${str1.replace(/hello(?! world)/g, SUBSTITUETE)}<br>`;
};

(?!)를 이용하여 ' world'가 뒤따르지 않는 hello를 찾아 마킹 처리를 하였습니다.

 

 

② Look behind

(?<=b)a

- 앞에 b가 존재하는 a를 조회

const SUBSTITUETE = "<mark>$&</mark>";

btn12.onclick = () => {
    const str2 = 'hello world lotte world t world';
    
    area12.innerHTML += `${str2.replace(/(?<=hello )world/g, SUBSTITUETE)}<br>`;
};

(?<=)를 이용하여 앞에 'hello '가 존재하는 world를 찾아 마킹 처리를 하였습니다.

 

(?<!b)a

- 앞에 b가 존재하지 않는 a를 조회

const SUBSTITUETE = "<mark>$&</mark>";

btn12.onclick = () => {
    const str2 = 'hello world lotte world t world';

    area12.innerHTML += `${str2.replace(/(?<!hello )world/g, SUBSTITUETE)}<br>`;
};

(?<!)를 이용하여 앞에 'hello '가 존재하지 않는 world를 찾아 마킹 처리를 하였습니다.

 

 

@ 실습 - 비밀번호 유효성 검사

- 8~12자리, 숫자/영문자/특수문자(!&/\*@)가 하나 이상 포함된 비밀번호 

 

HTML 코드

<fieldset>
    <legend>비밀번호 유효성 검사</legend>
    <input type="text" name="password" id="password" placeholder="비밀번호">
</fieldset>

입력값을 확인하기 위해 type을 text로 지정

 

Javascript 코드

password.onblur = (e) => {
    const val = e.target.value;

    if(!/^.{8,12}$/.test(val)) {
        alert('비밀번호는 8~12자리 이상이어야 합니다.');
        return;
    }

    if(!/\d/.test(val)) {
        alert('비밀번호는 하나 이상의 숫자를 포함해야 합니다.');
        return;
    }

    if(!/[a-z]/i.test(val)) {
        alert('비밀번호는 하나 이상의 영문자를 포함해야 합니다.');
        return;
    }

    if(!/[!&/\\*@]/.test(val)) {
        alert('비밀번호는 하나 이상의 특수문자(!&/\*@)를 포함해야 합니다.');
        return;
    }
    console.log('비밀번호가 유효합니다.')
};