Javascript 정규식 기초
모든 것을 정리하진 않았지만 정규식 쓸 일이 있을 때마다 한번쯤 볼 수 있도록 끄적여 봤다..
- https://regexr.com/ → 정규식 학습 & 실시간 확인 가능한 사이트
- 정규 표현식 - JavaScript MDN 문서
#
RegExp 객체JavaScript RegExp 객체는 global 또는 sticky 플래그를 설정(/foo/g, /foo/y 등)한 경우 이전 일치의 인덱스를 저장하므로 상태를 가지고(stateful) 있습니다
#
정규식을 사용하는 메소드#
RegExp#
객체 생성법- 리터럴 표기법
- 생성자 함수
#
lastIndexRegExp 객체(인스턴스)의 정규식의 검색 시작 위치를 담고 있는 속성이라고 생각하면 될 것 같다
- 값 업데이트 조건
- 값 초기화 조건
참고: 전역 플래그와 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]. 와 동일
#
AssertionAssertion 원문 (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만 대응
<=y)x 비교#
x(?=y)와 (?찾으려는 단어가 앞에 오는 것을 찾고 싶을 때인 지, 뒤에 오는 것을 찾고 싶은 지에 따라 쓰이는 정규식이 다름을 유의한다
- 앞에 오는 것을 찾고 싶을 때: x(?=y)
- 뒤에 오는 것을 찾고 싶을 때: (?<=y)x
#
플래그플래그의 종류는
우선 자주 사용하는 플래그인 g, i, u만 예제로써만 정리 해 보려고 한다.
원문은 여기 → 플래그를 사용한 고급검색 (en: Advanced searching with flags)