정규식 사용법

Tips 2017. 9. 11. 18:05


    Regular Expressions


정규식 테스트 사이트

https://regex101.com/



//-----------------------

* 옵션( 플래그, flags)

- g : 전체 검색(global match)

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

- m : 다중행(multi line)

- u : 유니코드


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

* 문자셋(특수문자)

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

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


\w (=[a-zA-Z0-9_]) 문자( "_") , 

\W (=[^a-zA-Z0-9_]) 문자 아님

- 유니코드 옵션(u) 상태에서는 유니코드(한글)도 포함

-     /\w/u


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

\v : 세로탭

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


\r 줄바꿈, carriage return (ASCII 13)

\n 줄바꿈, line-feed (newline) (ASCII 10)

\t

\f form-feed character (ASCII 12)

\v vertical whitespace


\b 단어 경계

\B 단어 경계가 아닌 부분

- 그룹[]안에서는 백스페이스, (그룹안에서 기능이 바뀌는 드문 경우)

- 예) \bCAT\b = CAT


\p{L}  유니코드 문자(숫자 제외) =    /\w/u

\p{N} 유니코드 숫자


//------------------------

모든 기호 문자  [\W\s]

=    [^\p{L}\p{N} ]+

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


모든글자 = \s\S


한글 =    [ㄱ-ㅎㅏ-ㅣ가-힣]


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

* 문자 클래스

[ ] : 그룹, 단일문자


:  한개 문자 (개행 문자를 제외)

- 그룹[]안 :   .  문자



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

* 앵커

^ : 문자열의 시작, 

- 그룹[]안 : not


$ : 문자열의 끝

- 그룹[]안 : $ 문자



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

* 반복(수량자)

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

* : 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




< 문자 클래스 >
\w*|\W*   :  모든 글자(한글, 영어, 숫자 포함)



//참고
http://highcode.tistory.com/6
http://oog.co.kr/406
https://www.ibm.com/support/knowledgecenter/ko/SSBLQQ_8.7.1/com.ibm.rational.test.ft.doc/topics/RegExExamples.html

반응형
Posted by codens