* 정규식 생성

const reg1 = /[0-9]/ig; //리터럴

const reg1 = new RegExp( '[0-9]', 'ig' );//생성자



//============

< RegExp 함수 >


* exec(str)

exec() 문자열 찾기, 결과값 = 일치한 문자열 배열, null

- 일치하는 첫번째만 알고 싶을때

- 캡쳐그룹을 알고 싶을때

- g 플래그가 있을때



* test(str)

test() 문자열 찾기, 결과값 = true , false



* toString() 정규식 문자열 반환



//===========

< String 함수 >


* match(regexp)

match() 문자열 찾기, 결과값 = 일치한 문자열 배열, null

- 캡쳐 그룹은 반환 안함

- g 플래그가 없으면, exec()와 결과가 동일

- g 플래그가 있으면, 객체가 아닌 일치하는 하위 문자열을 포함하는 배열을 반환



* search(regexp)

search() 문자열 찾기, 결과값 = 위치 인덱스, -1



* replace(regexp|substr, newSubStr|function)

replace() 문자열 치환






//=============

* 옵션( 플래그, flags)

- g : 전체 검색(global match)

- i : 대소문자 불문(ignore case)

- m : 다중행(multi line)

- u : 유니코드



//=============

* 문자셋(특수문자)

\d (= [0-9]) : 숫자 

\D (= [^0-9]) : 숫자 아님 


\s (= [ \t\v\n\r]) : 공간 문자 (하나의 공백 문자, 공간, 탭, 줄 바꾸기 )

\v : 세로탭

\S (= [^ \t\v\n\r]) :공간 문자가 아님


\w (=[a-zA-Z_]) 영문자( "_")

\W (=[^a-zA-Z_]) 영문자 아님


\b 단어 경계

\B 단어 경계가 아닌 부분



모든글자 = \s\S



//==========

* 문자 클래스

[ ] : 그룹, 단일문자

.  : 개행 문자를 제외한 모든 단일 문자



//================

* 앵커

^ : 문자열의 시작

$ : 문자열의



//================

* 반복(수량자)

- 이전요소가 몇개 일치할지 지정

* : 0개 이상

+ : 1개 이상

? : 0개 나 1개 


{n} : n개

{n,} : n개 이상

{n,m} : n개 이상 m개 이하



//================

< 캡쳐  >


* (x) : 포획 괄호(캡쳐, capturing parentheses)

/(foo) (bar) \1 \2/ 안의 '(foo)' 와 '(bar)'는 문자열"foo bar foo bar"

- 패턴 부분 : \1, \2 ...

- 치환 부분 : $1 $2

'bar foo'.replace( /(...) (...)/, '$2 $1')



* (?:x) : 비포획 괄호(non-capturing parentheses)

/(?:abc){1,2}/ : {}가 단어 전체 abc 에 적용

/abc{1,2}/ : {}가 마지막 b 에 적용

/(abc){1,2}/ : ?




//=====================

* 룩어헤드 (lookahead)


x(?=y) : lookahead 

x 뒤에 y 조건이 만족하는 경우, x 선택 (y는 선택 안됨)



x(?!y) : negated lookahead

x 뒤에 y 조건이 만족하지 않는 경우, x 선택


//

https://stackoverflow.com/questions/2973436/regex-lookahead-lookbehind-and-atomic-groups

string "foobarbarfoo":


bar(?=bar) finds the 1st bar ('bar'가 뒤에 있는 "bar")

bar(?!bar) finds the 2nd bar ('bar'가 뒤에 있지 않은 "bar")

(?<=foo)bar finds the 1st bar ('foo'가 앞에 있는 "bar")

(?<!foo)bar finds the 2nd bar ('foo'가 앞에 있지 않은 "bar")


(?<=foo)bar(?=bar)    finds the 1st bar ("bar" with "foo" before it and "bar" after it)


- 검색에 활용

(?=.*[0-9]) 숫자가 최소한 하나



//================

* 소극적 일치, 적극적 일치

일반적으로 적극적 일치가 적용됨

소극적 일치란? 

- 반복 ( * , + ) 뒤에 ? 를 붙여서 ( *? , +? )를 만들어 검색범위를 좁히는 것


//=====================================

< 유용한 활용 >



* 모든글자 = \s\S



* 옵션 

? = 0 or 1 

문자열 : https://qwe.com/ 과 qwe.com

정규식 : (https?:\/{2,2})?qwe.com\/?



* URL

https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/=]*)



* 패스워드 검사

function vaildPassword(p) {            

    var sp_allow = "\\]\[\~\!\@\#\$\%\^\&\*\(\)\-\+\_\{\}\:\<\>\,\.\?\/\|";  // ] 에 주의, \] 안됨 => \\]

    var sp_prevent = "\=\`\'\"\;\@\\\\";// \에 주의, \\ 안됨 => \\\\

    return /[a-z]/i.test(p) && //소문자가 최소한 하나                

        /[0-9]/.test(p) && //숫자가 최소한 하나

        RegExp(`[${sp_allow}]`).test(p) && //특수문자가 최소한 하나

        !RegExp(`[${sp_prevent}]`).test(p) && //금지문자  금지

        !RegExp(`[^a-z0-9${sp_allow}]`,'gi').test(p); //범위 : 영문자와 숫자, 허용특수문자 만 허용                

}


//

lookahead( (?=) ) 사용 검색

- lookahead는 소비를 하지 않아, 계속 전체 검색 가능

^ 시작

(?=.*[a-zA-Z]) 알파벳이 최소한 하나

(?=.*[0-9]) 숫자가 최소한 하나

(?=.*[!@#\$%\^&]) 특수문자가 최소한 하나

(?=.{8,}) 8 글자 이상


https://www.thepolyglotdeveloper.com/2015/05/use-regex-to-test-password-strength-in-javascript/

var mediumRegex = new RegExp("^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{6,})");



//=============================

* 로그인
(?=^[0-9a-zA-Z]*$)   -  영문숫자만 허용
(?=^[\\S]{3,7}$) - 글자수 3~7 로 제한



//=========================
*패스워드
(?=.*[a-zA-Z]) - 알파벳 최소 한개 포함
(?=.*[0-9]) - 숫자 최소 한개 포함
(?=.*[\~\!\@\#\$\%\&\*\(\)\_\+\-\=\{\}\\[\\]\:\;\<\>\?\,\.\/\^]) - 특수문자 한개 이상 포함
(?=^[^\`\|\'\"\\\\ ]*$) - 금지 문자 지정
(?=^[\x21-\x7E]*$) - 영문이외 문자 금지(한글 금지)



//=============

//참고

정규식 테스트 사이트

https://regex101.com/



https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D


https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/RegExp


https://docs.microsoft.com/ko-kr/dotnet/standard/base-types/regular-expression-language-quick-reference


https://www.w3schools.com/jsref/jsref_obj_regexp.asp


반응형
Posted by codens