Javascript 정규식 기초
모든 것을 정리하진 않았지만 정규식 쓸 일이 있을 때마다 한번쯤 볼 수 있도록 끄적여 봤다..
- https://regexr.com/ → 정규식 학습 & 실시간 확인 가능한 사이트
- 정규 표현식 - JavaScript MDN 문서
RegExp 객체#
JavaScript RegExp 객체는 global 또는 sticky 플래그를 설정(/foo/g, /foo/y 등)한 경우 이전 일치의 인덱스를 저장하므로 상태를 가지고(stateful) 있습니다
정규식을 사용하는 메소드#
RegExp#
객체 생성법#
- 리터럴 표기법
- 생성자 함수
lastIndex#
RegExp 객체(인스턴스)의 정규식의 검색 시작 위치를 담고 있는 속성이라고 생각하면 될 것 같다
- 값 업데이트 조건
- 값 초기화 조건
참고: 전역 플래그와 test()
exec()#
주어진 문자열에서 일치 탐색을 수행한 결과를 배열 혹은 null로 반환
test()#
String#
match()#
문자열이 정규식과 매치되는 부분을 검색
replace()#
어떤 패턴에 일치하는 일부 또는 모든 부분이 교체된 새로운 문자열을 반환
search()#
정규표현식과 주어진 스트링간에 첫번째로 매치되는 것의 인덱스를 반환한다.
찾지 못하면 -1 을 반환한다
split()#
주어진 문자열을 separator마다 끊은 부분 문자열을 담은 Array.
* 특수문자 문자열과 split('') 사용 시 주의#
note
MDN 공식 문서 왈,
특수문자 문자열을 split('')으로 나뉘면 캐릭터가 깨짐. UTF-16 코드유닛으로 나누게 되기 때문이라고 함.
스프레드 연산자나 Array.from 등을 이용할 것을 권장한다고 stackoverflow 질문을 링크 걸어 소개 해 주고 있음.
문자 클래스#
backslash(역슬래쉬: \)#
문자 그대로 해석하면 안된다고 알려주는거임.
info
\*, \b, \(특수문자) …
'*'#
0회 이상 연속으로 반복되는 부분과 대응된다
info
{0,} 표현과 같다
'+'#
1회 이상 연속으로 반복되는 부분과 대응된다
info
{1,} 표현과 같다
'+'와 '*'의 차이 비교#
'?'#
앞의 표현식이 0 또는 1회 등장하는 부분과 대응된다
info
{0,1} 표현과 같은 의미.
'?' 가 붙었을 때와 안 붙었을 때의 차이
만약 수량자 *, +, ?, {} 바로 뒤에 사용하면, 기본적으로 탐욕스럽던(가능한 한 많이 대응시킴) 수량자를 탐욕스럽지 않게(가능한 가장 적은 문자들에 대응시킴) 만듭니다
'angel'과 'angle'의 같은 정규식을 놓고 결과 비교
'.'#
개행 문자(newline character, \n)를 제외한 모든 단일 문자와 대응됨
- 키보드의 특수문자는 다 대응이 되는 듯 함
- 그러나 emoji (e.g., 💖, 😄, 🎉) 는 결과 값 안에서 깨짐
- 이럴 때는
[u 플래그]()를 활용하여 정규식이 유니코드 취급을 하도록 한다
- 이럴 때는
newline(개행문자: \n)#
정규식 내부의 n번째 괄호에서 대응된 부분에 대한 역참조 입니다. 여기서, n은 양의 정수입니다.
[^xyz]#
대괄호가 양옆으로 묶여있는 여기에서의 ^는 부정기호 NOT의 의미이다.
\w#
밑줄 문자를 포함한 영숫자 문자에 대응됩니다.
info
[A-Za-z0-9_] 와 동일
\W#
단어 문자가 아닌 문자에 대응됩니다.
info
A-Za-z0-9_ 와 동일
[\b]#
[\b]는 백스페이스에 대응됨
\D#
숫자가 아닌 문자에 대응
info
[^0-9] 와 동일
\s#
아래 항목에 대응됨
note
[ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]. 와 동일
\S#
공백 문자가 아닌 하나의 문자에 대응됩니다.
note
[^ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]. 와 동일
Assertion#
Assertion 원문 (en: Assertions)
행이나 단어의 시작 · 끝을 나타내는 경계와 (앞, 뒤 읽고 조건식을 포함한) 어떤 식 으로든 매치가 가능한 것을 나타내는 다른 패턴이 포함됩니다.
바운더리 타입 assertions(Boundary-type assertions)#
MDN문서: Boundary-type assertions
'^'#
입력 시작에 일치시킨다.
'$'#
입력의 끝에 일치시킨다.
\b#
참고문헌
단어 경계에 대응된다
= 다른 단어 문자 가 앞이나 뒤에 등장하지 않는 위치에 대응
단어 문자: 로마자 소문자와 대문자, 10진수 숫자, 밑줄 문자 그 외의 모든 문자는 단어 분리(word break)
\b다음에 문자가 들어가면, 해당 문자앞에아무것도 없어야 대응\b이전에 문자가 들어가면, 해당 문자뒤에아무것도 없어야 대응
\B#
단어 경계가 아닌 부분에 대응
아래와 같은 경우들에 해당
- 문자열의 첫번째 문자가 단어 문자가 아닌 경우, 해당 문자의 앞 부분에 대응됩니다.
- 문자열의 마지막 문자가 단어 문자가 아닌 경우, 해당 문자의 뒷 부분에 대응됩니다.
- 두 단어 문자의 사이에 대응됩니다.
- 단어 문자가 아닌 두 문자 사이에 대응됩니다.
- 빈 문자열에 대응됩니다.
note
문자열의 시작 부분과 끝 부분은 단어가 아닌 것으로 간주됩니다.
\b와 \B 비교#
note
https://stackoverflow.com/questions/6664151/difference-between-b-and-b-in-regex
\b matches the empty string at the beginning or end of a word.
\B matches the empty string not at the beginning or end of a word.
기타 assertions(Other assertions)#
x(?=y)#
x 뒤에 y가 오는 부분을 찾아내게 되면 x만 대응
x(?!y)#
x 뒤에 y가 오지 않는 부분을 찾아내게 되면 x만 대응
(?<=y)x#
x 앞에 y가 오는 부분을 찾아내게 되면 x만 대응
(?<!y)x#
x 앞에 y가 오지 않는 부분을 찾아내게 되면 x만 대응
x(?=y)와 (?<=y)x 비교#
찾으려는 단어가 앞에 오는 것을 찾고 싶을 때인 지, 뒤에 오는 것을 찾고 싶은 지에 따라 쓰이는 정규식이 다름을 유의한다
- 앞에 오는 것을 찾고 싶을 때: x(?=y)
- 뒤에 오는 것을 찾고 싶을 때: (?<=y)x
플래그#
플래그의 종류는
우선 자주 사용하는 플래그인 g, i, u만 예제로써만 정리 해 보려고 한다.
원문은 여기 → 플래그를 사용한 고급검색 (en: Advanced searching with flags)
