본문 바로가기
Development (국비 복습 )/자바

[2023-03-06]정규표현식 Regular Expression(regex)

by Puddingforever 2023. 3. 6.

 

 

 

1.regex 기본 리터럴 생성문법 

 

/abc/: abc 문자열이 있는지 찾는다 

var msg = "abcdf";
var pattern = /abc/; // type은 object
var result = pattern.test(msg); // true

활용

abc 패턴이 없으면 , console실행 

var msg = "abdef";
var pattern = /abc/;
if(!pattern.test(msg)){
	console.log("다시 입력하세요");
}

 

/d 숫자가 포함 되어있는지 찾기 

var msg = 123;
var pattern = /\d/;
var result = pattern.test(msg);
console.log(result); // true  숫자가 하나 나옴

 

/\d\d/ 이렇게 연속으로 적는 경우, 조건이 시작된다. 이 경우, 숫자가 연속으로 2개는 있어야 true가 나온다

var msg = 1+"dslf";
var pattern = /\d\d/;
var result = pattern.test(msg); 
console.log(result); //false . 숫자 다음에 바로 문자열이 와서 false

console.log(/\d\d/.test(123); //false 조건을 넘어버리면 false값이 나온다.

 

console.log(/\d/.test(123)); //true 숫자가 포함되있는지. 하나이상
console.log(/\d\d/.test(1)); // false 숫자가 두개 이상 찾아야하는데 없어서

 

{개수,}몇개이상 연속으로 된 것을 찾을 때

 

{n} : 정확히 n회만

{n,} : 최소 n회만 

 

숫자가 연속으로 정확히 2개 이상

var msg = 123456;
var pattern = /\d{2}/; // 숫자가 연속으로 2개 
var result = pattern.test(msg); // true

 

.(도트)는 아무 글자를 나타냄 !!! 아무 글자나 정확히 3개 연속이상 

var msg=12;
var pattern=/.{3}/; //아무 글자나 3개 이상
var result = pattern.test(msg); 
console.log(result); //12니까 글자가 두번 반복되서 false

 

영어 소문자,영어 대문자,숫자 0~9까지나 _가 정확히 3개 연속 이상 

var msg = "as%d"
var pattern = /\w{3}/;
var result = pattern.test(msg); 
console.log(result); // %때문에 false나온다

/w 는 _ 도 포함한다 

var msg = "___";
var pattern = /\w{3}/;
var result = pattern.test(msg);
console.log(msg); // true

 

 

\s 빈칸,탭키,엔터를 포함한다. 

최소 3번 이상

//빈칸이 세번이상
console.log(/\s{3,}/.test("  d")); //빈칸이 두번이라서 false
//탭키가 세번 이상
console.log(/\s{3,}/.test("			")); //true 탭키 3번 이상
//엔터가 세번 이상
console.log(/\s{3,}/.test("\n\n\n")); // treu 엔터키 3번 이상

문장에 띄어쓰기 최소 3번 있는지 확인 

var message = "I like pudding ";
var pattern = /\s{3,}/;
var result = pattern.test(message);
console.log(result); // false;

띄어쓰기를 세번 썻지만 연달아 쓰지 않아서 false

 

이메일에 숫자 포함되어있는지 확인 

var email = "pudding12@naver.com";
var pattern = /\d/;
console.log(pattern.test(email)); //true

 

[] : []내에 명시된 문자 중 한 글자 

주의점) []내의 .(도트)는 아무 문자가 아니라 문자 그대로의 .(도트)를 의미한다.

\를 적을 때는 2개를 적어야 \ 한개를 찾는다는 의미이다, 

console.log(/[abc.\\]/.test("tsy,"))//false
console.log(/abc.\\/.test("ayu,")) // a때문에 true
console.log(/abc.\\/.test("tsy,\\")); // \때문에 true
참고로 
console.log(/abc.\\/.test("tsy,\")); // 이렇게 적으면 \때문에 에러가 난다.\\는 항상 두번 적기

a 또는 b 또는 c또는 .또는 \를 찾기 

 

 

()안의 문자열은 하나의 단위로 취급되며, + 는 1회 이상 나오는지 확인하는 기호이다. 

/(\d\w)+/ : 앞에 숫자고 뒤에 (영문대소문자,숫자,_)가 한번이상 반복되는지 확인 

console.log(/((d\w\)+/.test("2d")); //true
console.log(/(d\w\)+/.test("dd")); //false

[]안의 () 은 기능을 상실한다 

console.log(/[d(cd)e]/.test("cty")) // true

만약 cd를 찾고 싶다면 어떻게 해야할까?

(d|cd|e)로 만들어 준다 regex에서 |는 or를 가르킨다.

console.log(/(c|cd|y)/.test("cdt")); // true

 

 

+은 1회이상 반복을 확인하지만 *은 0회 이상 반복인지 확인한다.

console.log(/(\d\w)*/.test("")); 
//안에 아무것도 안들어 있지만 *는 0회 이상 있는지 확인하니까 true

regex 메소드 test()는 *를 쓰면 무조건 true가 나오기 때문에 *로는 따로 확인할 필요가 없는거 같다.

단순히 , 중간에 갯수를 제한하고 싶지 않을 때 쓴다

/^(abc)(.*)(abc)$/ : abc로 앞뒤가 완성되야하며, 중간에 아무글자는 여러개 와도 된다 

 

또는을 나타내는 | 기호

주의!!  |기호는 () 안에서만 쓸 수 있다.

그냥 .만 넣으면 모든 문자를 가르키는 것이기 때문에 \. 으로 대입한다.

console.log(/(a|\.)/.test(".l");//true

그냥 .를 넣으면 모든 문자를 가르킴 !!!!!!!! 

console.log(/(a|.)/.test("dd"));//true

.이랑 a가 포함되지 않았지만 .(도트)는 모든 문자를 가리키기 떄문에 true가 나옴 

console.log(/\s{2, }/.test("I  like pudding"))
// 띄어쓰기 두번 연속인데 왜 false 나오지 ?? 뒤에 인수에 띄어쓰기를 했는데 체크 못해서 false?
console.log(/\s{2,}/.test("I   like pudding")) // true I랑 like 사이에 띄어쓰기 두번함

regex 시작과 끝 표시 

시작 ^

^[] : []안의 문자로 시작된다는 의미 

/^(abc)/ ()문자열이 abc로 시작되야함 

console.log(/^(abc)/.test("abcd")); // true
console.log(/^[abc]/.test("add")); //true

만약 괄호를 안넣는 경우라도 ^가 오면 () 이렇게 묶이게 된다.

console.log(/^abc/.test("ade")); //false

 

끝 $

/(abc)$/ 문자열이 abc로 끝나야 함 

console.log(/(abc)$/.test("dddabc")); //true

 

[^] 부정을 의미 

[주의] (^)는 없다 

괄호 밖에 있으면 시작을 의미하지만, 안에 있다면 부정을 의미한다.

console.log(/[^abc]/.test("sddd")); //true

^[^a-zA-Z] 영문 대소문자가 아닌 것으로 시작해야함 

console.log(/^[^a-zA-Z]/.test("AA123")); //false
console.log(/^[^a-zA-A]/.test("123A")); //true

 

[^a-zA-Z]$ 영대소문자가 아닌 문자중 하나로 끝나야함 

console.log(/[^a-zA-Z]$/.test("123A")); //false
console.log(/[^a-zA-Z]$/.test("abd1")); //true

[^0-9]$ 숫자가 아닌 문자 중 하나로 끝나야 함 

 

console.log(/[^0-9]$/.test("dd1"); //false
console.log(/[^0-9]$/.test("123A"); //true

 

^랑 $이 같이 나오면 문자열이 묶이게 되서 ^문자$ 이거 딱 한번만 쓸 수 있다.

console.log(/^abc$/.test("abcabc")); //false
console.log(/^abc$/.test("abc")); //true

 

0회 이상을 만드는 별표 *를 주어서 , 안에는 여러개의 문자를 넣을 수 있도록 하였다. 

console.log(/^(abc)(abc)$/.test("abcabc")); // true
console.log(/^(abc)(abc)$/.test("abcdabc")); //false 
//regex안에 다른 문자를 허용하는 식이 없기 때문에 false이다.
console.log(/^(abc).(abc)$/.test("abcdabc"));//true
console.log(/^(abc)(.*)(abc)$/.test("abcdefdsabc"))//true

 

ac나 bc로 끝나는 것 찾기 

console.log(/(a|b)c$/.test("acdd")); //false
console.log(/(a|b)c$/.test("asbc")); //true
console.log(/[ab]c$/.test("acc")); //false
console.log(/[ab]c$/.test("ddbc"));//true

숫자가 안들어 있는 것 찾기 

console.log(/[^\d]/.test("123"));//false
console.log(/[^0-9]/.test("123")); //false

 

괄호 안에 안넣으면 시작하는 걸로 봄 

console.log(/^\d/.test("123")); //true
cosnole.log(/^\d/.test("a123")); // false

 

\w : a-z, A-Z,0-9, _ 이게 포함되있으면 true

 

 var targetStr = "ABC 123abc 1\n23ABC \n123";
console.log(/\w/.test(targetStr)); //true

 

regex의 match메소드

정규식 가져온 값을 반환함

 

\w\s\w : 양쪽으로 a-zA-Z0-9_ 이게 있고 가운데에 탭키,띄어쓰기,엔터가 있음

 var targetStr = "ABC 123abc 1\n23ABC";
console.log(/\w\s\w/.test(targetStr)); // ture

C 1, c 1, 1\n2 가 들어있을까?

 

var targetStr = "ABC 123abc 1\n23ABC";
console.log(targetStr.match(/\w\s\w/)); // 'C 1'

다음 띄어쓰기, 탭키, 엔터키 등은 끝으로 생각하기 때문에 앞에서 찾은 것만 나오는 것이다. 

 

/g 플래그를 넣어주면 , 엔터 탭키 띄어쓰기를 무시하고 찾아준다. 

 var targetStr = "ABC 123abc 1\n23ABC";
 console.log(targetStr.match(/\w\s\w/g);//[ 'C 1', 'c 1' ]
 
 var str = "ABC 123abc 1t\n23ABC \n123";
console.log(str.match(/\w\s\w/g)); // ['C 1','c 1','t\n2']

ig를 넣으면 영어 대소문자를 구분하지 않는다.

var str = "ABC 123abc 1t\n23abc 123";
console.log(str.match(/abc\s123/ig)); ['ABC 123','abc 123']

만약 대소문자 구분을 안하면 null이 나올 수도 있다.

 var str = "ABC 123abc 1t\n23ABC 123";
console.log(str.match(/abc\s123/g); null

 

/m플래그 사용 

모질라 설명 : ^와 $랑 보통 같이 사용되며, 엔터키의 값까지 찾아낸다. 

m Allows ^ and $ to match newline characters. multiline

^ or $+ 엔터키인 경우 , g가 의미 없어지고 , 반드시 그 값을 찾으나 m플래그를 더해주면 , 그 의미가 삭제되지 않는다 

var str = "1 홍길동\n2 이순신\n3 슈퍼맨"; 

//전체 문자열의 숫자 찾기 
console.log(str.match(/\d/g)); //[ '1', '2', '3' ]
//엔터키의 앞이 숫자열인지 찾기 
console.log(str.match(/\d/gm)); //[ '1', '2', '3' ]
//처음 시작되는게 숫자인지 찾기 g가 들어가도,
//^때문에 의미가 없어진다. ^가 더 강력하다 
console.log(str.match(/^\d/g)); //1
//처음 시작되는 것이 숫자인지 찾고, 엔터키의 앞이 숫자로 시작되는 것까지 찾아낸다다
console.log(str.match(/^\d/gm));  //[ '1', '2', '3' ]

 

 

abc\b 단어의 맨 앞이나 맨 뒤에 abc문자열이 들어가 있는지 찾는다.

만약 두개가 있을 경우, 뒤에 있는 것을 찾아낸다.

search()찾은 문자열의 첫번째 인덱스 번호를 반환해준다.

var str = "bc123abc";
console.log(str.search(/bc\b/)); // 6

주의 !!! \b의 경우 , 숫자는 안찾아준다 

var str = "bc123abc";
console.log(str.search(/1\b/)); // -1

\b는 띄어쓰기가 있으면 , 그 다음은 찾지 않는다.

var str = "abc 123 abc";
var reg = /bc\b/;
console.log(str.search(reg))//1

띄어쓰기 뿐만 아니라, 특수문자도 그 다음 값을 찾지 않는다.

var str = "abc$123bc!abc"; 
var reg = /bc\b/; 
console.log(str.search(reg));//1

 

하지만 \b가 아니라 \$로 된건 띄어쓰기를 무시하고 마지막 값을 찾아준다. 

var str1 = "bc123abc";
var str2 = "abc 123 abc";

//문자열의 끝이 b다음 c로 끝남 
var reg = /bc$/;   

console.log(str1.search(reg)); //6
console.log(str2.search(reg)); //9

 

a* :a가 0회 이상 즉, a?랑 똑같은거임 

a+:a가 1회 이상 

a?: a가 있어도 되고 없어도 된다.

colou?r 는 color도 되고 , colour도 된다. u가 있어도 되고 없어도 되기 때문이다.

? A question mark matches zero or one of the preceding character, class, or subpattern. Think of this as "the preceding item is optional". For example, colou?r matches both color and colour because the "u" is optional.

https://www.autohotkey.com/docs/v1/misc/RegEx-QuickRef.htm

 

Regular Expressions (RegEx) - Quick Reference | AutoHotkey

{min,max} Matches between min and max occurrences of the preceding character, class, or subpattern. For example, a{1,2} matches ab but only the first two a's in aaab. Also, {3} means exactly 3 occurrences, and {3,} means 3 or more occurrences. Note: The sp

www.autohotkey.com

 

/lo*/

l은 반드시 있어야 하지만 , o는 있어도되고 없어도 된다.

var str = "heloolo world";
var reg = /lo*/;
console.log(str.search(reg)); [loo,lo,l]

 

/lo+/ l과 o 둘다 반드시 있어야함 l은 한번오지만 o는 한개 이상 찾음

var str = "Heloolo World!";
var oneReg = /lo+/g;     // l문자 다음에 o가 1회이상
console.log(str.match(oneReg)); // [`loo`,`lo`]

 

/lo?/ l은 꼭 있어야하지만 o는 있어도 되고 없어도 됨 /lo*/랑 똑같음 

var str = "Heloolo World!";
var zeroOneReg = /lo?/g; // l은 포함되지만 d는 있어도 되고 없어도 됨
console.log(str.match(zeroOneReg)); // ['loo','lo','l']

 

/lo{2,}/ l은 반드시 있고 o는 두개 이상 

var str = "Heloolo World!";
var twoReg = /lo{2,}/g; // o가 두번이상 나옴 
console.log(str.match(twoReg)); // ['loo']

 

숫자와 기호가 섞여있는 경우 

 

/\d+/g 숫자 패턴을 다 찾음 +이 있으니까 반드시 포함되있어야함 g있으니까 문자열 전체에서 찾음

var str = "1abc12abc123abc123c";
var reg = /\d+/g;
console.log(str.match(reg)); //[ '1', '12', '123', '123' ]

 

/\d?/g 숫자가 아니여도 패턴을 찾을거지만, 값은 숫자를 리턴함 , 하나하나 찾는다 

var str = "1abc12abc123abc123c";
var reg = /\d?/g; // 숫자가 없어도 찾지만, 숫자면 숫자패턴을 리턴함 
console.log(str.match(reg)); 
['1', '', '', '',  '1', '2',  '',  '', '', '1', '2', '3',  '',  '', '', '1', '2', '3',
  '',  '']

 

 

/\d+?/ 숫자가 반드시 있어야하며, ?로 숫자 찾은거 하나하나 리턴해줌

var str = "1abc12abc123abc123c";
var reg = /\d+?/g;
console.log(str.match(reg)); //[  '1', '1', '2','1', '2', '3','1', '2', '3']

처음에 /\d+/로 반드시 숫자를 찾음 -> 1,12,123,123

여기서 /\d+?/로 인덱스 0에서 1을 찾고 , 인덱스 1의 1과 2를 찾고 인덱스2의 1과 2 와 3을 찾아서 숫자를 다 찾아준다.

 

 

()가 들어갔을 때 활용법

전체를 먼저 찾고 -> 그 안에서 ()를 찾는다

var str = "abc 123ab123";
var reg = /(\w+) (\d+)/;
console.log(str.match(reg)); 
'abc 123',
  'abc',
  '123',

처음에 /(\w+) (\d+)/ 전체로 찾을 것을 반환 , 그 다음 순서는 ()괄호에 있는 것을 반환하는데, 찾는 장소는 처음 반환한 것으로 찾는다 

 

첫번째 반환한 곳에서 ()의 조건을 찾는다.

 

var str = "abc 123ab123";
var reg = /\w+ \d+/;

console.log(str.match(reg)); // abc 123만 반환

 

 

String객체의 replace()를 사용할 때도 regex를 쓸 수 있다.

 

var str = "Java JavaScript JAVA JAVASCRIPT";
var result = str.replace(/java/gi,"자바");
console.log(result); //자바 자바Script 자바 자바SCRIPT

 

 

패턴을 그룹화할 때 $을 사용한다

 

var yourStr = "Hong Gil Dong";
var nameRegExp = /(\w{2,})\s([A-Za-z]{2,}) ([A-Za-z]{2,})/;  
 // replace를 사용하여 패턴그룹 $1 , $2 , $3으로 들어간다
text.innerHTML += yourStr.replace(nameRegExp,"$1 $2 $3")
text.innerHTML += yourStr.replace(nameRegExp,"$2-$3 $1")
text.innerHTML += yourStr.replace(nameRegExp,"$3 $1 $2")

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

"foo".replace(/(f)/, "$2");
// "$2oo"; the regex doesn't have the second group

"foo".replace("f", "$1");
// "$1oo"; the pattern is a string, so it doesn't have any groups

"foo".replace(/(f)|(g)/, "$2");
// "oo"; the second group exists but isn't matched

id에 입력하는 값의 조건

영문대소문자,숫자,_만 사용

숫자로 시작되면 안됌

최소 5글자 이상, 최대 20글자수만 가능 

위의 조건을 만족하는 경우 alert창에 "사용가능한 아이디 입니다"

위의 조건을 만족하지 않는 경우, alert 창에 사용할 수 없는 아이디 입니다 뜨게 만들기 

 

처음 설께한 것 

[설계]
-버튼 누르면 함수 실행 
-사용자 입력한 값을 변수에 대입
-test()함수를 이용하여 , 매치가 안되면 false , 매치가 되면 true를 가지고 옴

[정규식 만들기]
-먼저 5~20까지의 문자의 길이 검사를 한다.
-앞자리가 숫자인지 숫자가 아닌지 검사한다.
-string의 startsWith() 메소드를 사용하여 , 0~9로 시작하는 것을 check= true로 만든다.
-틀림 



 

startsWith는 정규표현식을 못쓴다 아래식 틀림 

function checkMidValue1(){
      //아이디 값을 가져옴
     var mid = document.getElementById("mid").value;
      var regex = /\w{5,20}/;

      if(!regex.test(mid)){
         alert("사용할 수 없는 아이디 입니다.")
      }else{
         //사용 가능. 이제 앞자리가 숫자이면 안되는 것을 비교한다.
         //string.startsWith에는 regex를 못쓴다.
        var check= mid.startsWith(/^[0-9]/);

         if(check){
            //앞자리가 숫자면
            alert("사용할 수 없는 아이디입니다.")
         }else{
            alert("사용할 수 있는 아이디입니다")
         }
      }​

     
<input type="text" name="mid" id="mid" placeholder="원하는 아이디를 입력하세요..."><br><br>
<input type="password" name="mpw" id="mpw" placeholder="원하는 암호를 입력하세요..."><br><br>
<input type="text" name="jumin1" id="jumin1" placeholder="주민번호 앞자리 6자리를 입력하세요"><br><br>
<input type="text" name="jumin2" id="jumin2" placeholder="주민번호 뒷자리 7자리를 입력하세요"><br><br>

<button type="button" onclick="checkAllValues();">회원가입</button>

<script>
//정규표현식 테스트
// document.write(/^[A-Za-z_][A-Za-z0-9_]{4,9}$/.test("1abdcdefgh") + "<br>"); //숫자로 시작 , false
// document.write(/^[A-Za-z_][A-Za-z0-9_]{4,9}$/.test("ab3") + "<br>"); //5글자 미만 , false
// document.write(/^[A-Za-z_][A-Za-z0-9_]{4,9}$/.test("ab345678901") + "<br>"); //10글자 초과 , false
// document.write(/^[A-Za-z_][A-Za-z0-9_]{4,9}$/.test("a$23456789") + "<br>"); //_이외의 특수기호 사용 , false
// document.write(/^[A-Za-z_][A-Za-z0-9_]{4,9}$/.test("a_B3456789") + "<br>"); //_이외의 특수기호 사용 , true

function checkAllValues() {
    checkMidVale1() ;
}


function checkMidVale1() {
    //문제1: id에 입력하는 값의 조건
    // - 영문대소문자,숫자,_ 문자만 사용
    // - 숫자로 시작되면 않됨
    // - 최소 5글자 이상,  최대20글자수만 가능

    //위의 조건을 만족하는 경우, alert 창에 "사용 가능한 아이디 입니다." 표시됨
    //위의 조건을 만족하지 않는 경우, alert 창에 "사용할 수 없는 아이디 입니다." 표시됨

/*  [프로그래밍]
    1. 아이디 입력란의 입력값을 읽어와서 변수에 저장합니다.
    2. 요구사항의 정규표현식을 작성합니다.
    3. 입력값이 정규표현식에 적합유무 확인 -> if else 문 사용
*/
    var mid = document.getElementById("mid").value ;
    var midReg = /^[A-Za-z_][A-Za-z0-9_]{4,19}$/ ;
    //var midReg = /^[^0-9][A-Za-z0-9_]{5,20}$/ ;
    if(midReg.test(mid)) {
        alert("사용 가능한 아이디 입니다.");
    } else {
        alert("사용할 수 없는 아이디 입니다.");
    }

    // if(!midReg.test(mid)) {
    //     alert("사용할 수 없는 아이디 입니다.");
    //     return ; // if뿐만 아니라 함수 자체가 종료됨 . 
    // } 
    

}   


</script>

 

댓글