* 정규식 생성
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://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://www.w3schools.com/jsref/jsref_obj_regexp.asp
'Code > JavaScript' 카테고리의 다른 글
[JavaScript] 기본 이벤트 동작 중지시키기(가로채기) event.preventDefault() (0) | 2019.01.05 |
---|---|
[JavaScript] 이벤트 처리(전달, 전파) 방식 - 버블링, 캡쳐링 (0) | 2019.01.05 |
[JavaScript] 배열(Array) (0) | 2019.01.01 |
[JavaScript] 클로저(Closer) (0) | 2019.01.01 |
[JavaScript] for 루프 키워드 (0) | 2019.01.01 |