정규 표현식
- 역할
- 문자 검색
- 문자 치환
- 문자 추출
- -1은 해당사항이 없을 경우 반환
만들기
- 생성자 함수 방식
- const regexp = new RegExp(“표현식”,”옵션”);
- 리터럴 방식
- const regexp = /표현식/옵션;
메서드
- 원본에 영향 없음
메서드 | 설명 |
---|---|
reg.test ('') |
일치/불일치 (Boolean 반환) |
''.match (reg) |
매치되는 문자열을 Array로 반환 |
''.replace (reg,replace) |
'' → replace 후 반환 |
- 그 외 메서드
-
reg
.exec
(‘’) : 제일 처음 일치하는 단어의 정보 반환 (배열) -
’’
.search
(reg) : 일치하는 단어의 첫 인덱스번호 반환 -
’’
.split
(reg) : 해당 단어를 기준으로 요소를 자르고
해당 단어는 포함안된 배열을 반환 -
reg.toString() : 생성자 함수 방식을 리터럴 방식의 문자열로 반환
-
플래그
- g
- 모든 문자와 여러 줄 일치(global)
- 문자를 전부 다 훑는다
- i
- 대소문자를 구분하지 않음(insensitive, ignore case)
- m
- 여러 줄 일치(multi line)
- 변수 내부의 line은 시작과 끝이 처음과 마지막으로 하나이지만
줄바꿈이된 line별로 시작과 끝을 두어 각 line을 확인
- u
- 유니코드(unicode)
- 정규식을 범위로 작성할때 유니코드의 순서가 적용된다
사용 예제
- 기호의 의미를 하나하나 확인하기 전 예제를 보자
- /ab/g
- 전체 문자 중
ab
가 포함되어 있는지 확인
- 전체 문자 중
- /[ab]/g
- 전체 문자 중
a
,b
가 포함되어 있는지 확인
- 전체 문자 중
- /[0-9]/g
- 전체 문자 중 0~9중의 숫자가 포함되어 있는지 확인
- 유효성 검사
- /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/
- 핸드폰 번호
/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
- 이메일
- /^\d{3}-?\d{3}$/u
- 우편 번호
- /^[a-zA-Z]\w{2,7}$/u
- 아이디
- /^\d{2}[0-1]\d[0-3]\d-?[1-6]\d{6}$/u
- 주민등록 번호
특수기호(패턴)
패턴 | 사용 예 | 의미 |
---|---|---|
^ | /^ab/ | line에서 맨 앞이 ab로 시작 |
$ | /ab$/ | line에서 맨 뒤가 ab로 끝남 |
. | /a./ | 단어에서 a 뒤에 임의의 한 문자가 온다 |
| | /a|b/ | 단어에서 둘 중 하나에 해당하는지 확인 |
* | /a*/g | *앞의 한개의 문자가 0회 이상 중복되는 부분을 최대한 묶음 papaa → ['','a','','aa'] |
*? | /a*?/g | a*의 탐욕의 반대 게으름으로(lazy) papaa → ['','','','',''] |
+ | /a+/g | +앞의 한개의 문자가1회 이상 중복되는 부분을 최대한 묶음 papaa → ['a','aa'] |
+? | /a+?/g | 1회 이상 중복되는 부분을 묶지 않음 papaa → ['a','a','a'] |
? | /abc?/g | ?앞의 한개의 문자가 없거나 1회 있거나 abcabdabcc → ['abc','ab','abc'] |
?? | /abc??/g | 마찬가지로 적은 쪽(없거나)을 선택 abcabdabcc → ['ab','ab','ab'] |
{} | /abc{2}/g | 앞의 한개의 문자의 반복 개수 abcabdabcc → ['abcc'] {2,}는 2번이상 반복 {2,5} 2번이상 5번 이하 {2,5}? 는 2번이 된다 |
() | /(ab)+/g | ab를 그룹으로 취급 ababab → ['ababab'] abbbabbb → ['ab','ab'] |
() | /(\d+)(\w))/ | 순서대로 캡쳐된다 123abc → ["123a","123","a"] 캡쳐 없는 경우/\d+\w/ → ["123a"] 캡쳐된 부분은 독립적으로도 추출 |
() | /(a)\1/ | 캡쳐1은 \1에 변수처럼 할당된다(9까지 가능) 즉 aa와 독립적 a 가 실행된다 aabb → ['aa','a'] |
() | /((b))\1\2/ | 캡처 푼 것과 캡처 1,2로 bbb ((b)) 는 b,b가 된다 aabbbcc → ['bbb','b','b'] |
(?<>) | /?<test-case>/ | /?<test-case>a/ → groups.test-case = a 가 된다 (‘object’ 타입이므로 ‘camelCase’) |
(?:) | /(?:ab)+/ | 캡쳐를 하지 않는 그룹 ababab → ['ababab'] 캡쳐를 한다면 ab+ 가 실행되어 'ab'가 포함된다 |
(?=) | /ab(?=c)/ | (?=c) 앞의 ab를 찾고 뒤에 c가 오는지 확인 abc → ['ab'] abd → null |
(?!) | /ab(?!c)/ | (?!c) 앞의 ab를 찾고 c가 오면 null 이외는 ab 반환 (ab뒤에 c가 오는 경우만 배제) |
(?<=) | /(?<=a)bc/ | 확인 순서는 a가 오는지 확인이 먼저 abc → ['bc'] zbc → null |
(?<!) | /(?<!a)bc/ | 앞에 a가 오면 null 이외는 bc 반환 (bc앞에 a가 오는 경우만 배제) |
[] | /[a-z]/ | []안은 or의 의미, -는 범위를 의미 즉 a,b,c...z 중 일치하는지 찾는다 |
[] | /[^.]/ | []안에서의 ^는 제외의 의미, [] 안에서 이스케이프\를 붙이지 않고 특수문자를 사용할 수 있다 |
[]{} | /ab[5-9]{2}/ | ab를 포함하며 5-9로 이루어진 2자리수를 포함하는 것과 매치 |
특수문자
- 이스케이프
- \., \?, \/, $, \^
- \b
- 영문 대소문자 52개 + 숫자 10개 + _(underscore) 가 아닌 나머지 문자에 일치하는 경계(boundary) (공백을 의미)
- \B
- 반대의 의미 문자를 의미
- \d
- digit 숫자를 의미
- \D
- 숫자가 아닌 문자를 의미
- \w
- Word, 영문 대소문자 + 숫자 + _ 를 의미
- \W
- \w와 반대를 의미
- \s
- 공백(Space, Tab 등)을 의미
- \S
- 공백이 아닌 문자를 의미
- \n
- 줄 바꿈(LF, U+000A)
이하의 내용은 참고
- \x 16진수 문자를 의미, /\x61/는 a에 일치
- \0 8진수 문자에 일치, /\141/은 a에 일치
- \u 유니코드(Unicode) 문자에 일치, /\u0061/는 a에 일치
- \r 캐리지 리턴(CR, U+000D) 문자에 일치
- \t 탭 (U+0009) 문자에 일치
우선순위
우선순위 | 패턴 |
---|---|
1 | \ |
2 | (), (?:), (?=), [] |
3 | *, +, ?, {} |
4 | ^, $, \b |
5 | | |
기타 활용
이하의 사이트를 참조함
-
iframe 제거
1
$STRING=preg_replace("!<iframe(.*?)<\/iframe>!is","",$STRING);
-
제거1
$STRING=str_replace(" "," ",$STRING);
-
복수 공백 합치기
1
$STRING=preg_replace("/\s{2,}/"," ",$STRING)
-
style=”” 제거
1
$STRING=preg_replace("/ style=(\"|\')?([^\"\']+)(\"|\')?/","",$STRING);