경계 : \w로 word 선택하기
이전 글에서 어떤 범위를 지정할 때 [-]를 사용했었다. (ex. [a-z])
경계를 사용하면 보다 간략하게 표시할 수 있다.
w는 word라는 뜻인데, 이 word에는 알파벳(대소문자) + 숫자 + _(언더바)가 포함된다.
✏️ 예시)
[Case 1] \w
- 알파벳 숫자 언더바 모두가 선택된다.
[Case 2] \w*
- 수량자 '*'의 의미는 0~1~여러 개를 뜻한다. 위와 같아보이지만 First match에서 A / A1로 다르다.
✏️ 예시)
[Case 3] [a-z]\w*
- 소문자 중 아무거나로 시작하고 문자면 0~1~여러 개를 선택한다.
- 그래서 c부터 시작하며 공백이나 콜론, 대시를 제외한 단어들이 선택된다.
[Case 4] \w{5}
- 중괄호 안의 숫자만큼 단어 개수가 붙는다. 단어 5개가 연속으로 선택되어야 한다.
[Case 5] [A-z0-9_]
- 대문자~소문자거나 0~9거나 _인 경우 선택한다. \w와 동일하다.
대문자 W의 경우에는 non-word character로 아까 알파벳+숫자+언더바를 제외한 모든 것이 포함된다.
✏️ 예시)
[Case 1] \W
- 알파벳+숫자+언더바를 제외한 모든 것들이 선택된다.
[Case 2] \w
- 소문자의 경우에는 위에서 배운 것처럼 반대로 알파벳+숫자+언더바가 선택된다.
[Case 3] [^A-zo-9_]
- 대괄호 안 ^의 뒤는 not 으로 해석되어 알파벳+숫자+언더바가 아닌 것을 선택하므로 Case 1과 동일하다.
(고 하는데 뭔가 오류가 있는 건지 ^의 포함 여부가 다르다. ^_^;)
경계 : \s로 공백 선택하기
s는 화이트 스페이스(스페이스, 개행, 탭)를 뜻한다.
✏️ 예시)
이건 쉬워서 간단히 보기만 해도 이해할 수 있다.
소문자 s의 경우 공백만 선택하고, 대문자 S의 경우 공백 이외를 선택한다.
경계 : \d로 숫자 선택하기
소문자 d는 digit(숫자)를 나타내고, 대문자 D는 숫자 이외의 모든 것(공백, 알파벳, 특수문자 등)을 나타낸다.
\d는 [0-9]와 동일한 것을 선택한다.
✏️ 예시)
경계 : \b (워드 바운더리) 💣
\b는 A word boundary로 단어의 경계를 선택한다.
잘 이해가 안돼서 공식 문서를 보니 [문자와 공백 사이처럼 단어의 문자 뒤에 다른 단어의 문자가 오지 않는 위치]를 말한다.
문자열의 어느 한 쪽은 \w에 해당되는 word character(알파벳+숫자+언더바)고, 그렇지 않은 다른 쪽이 \b에 해당한다.
word character로 시작하거나 끝나는 시점 역시 \b에 해당한다.
I Like Lilly에 \b으로 테스트를 해볼 때,
|I| |Like| |Lilly|
\b.로 테스트를 해볼 때, 단어의 앞과 단어와 단어 사이의 공백을 체크한다.
I Like Lilly
.\b로 테스트를 해볼 때, 단어의 뒤와 단어 사이의 공백을 체크한다.
I Like Lilly
.\b.으로 테스트를 해볼 때, 아래와 같다.
I Like Lilly
✏️ 예시)
대문자 B도 있다.
대문자 B는 non-word boundary, 즉 문자의 경계가 아닌 것들을 선택한다.
똑같이 I Like Lilly에 \B으로 테스트를 해볼 때,
I L|i|k|e L|i|l|l|y
\B.로 테스트를 해볼 때,
I Like Lilly
.\B로 테스트를 해볼 때,
I Like Lilly
.\B.로 테스트를 해볼 때,
I Like Lilly
✏️ 예시)
바운더리가 아닌 쪽의 앞, 뒤로 선택되었음을 알 수 있다.
경계 : \A 와 \Z
\A: 문장의 맨 앞을 기준으로 표현
\Z: 문장의 맨 뒤를 기준으로 표현
이전에 살펴본 ^(행의 시작), $(행의 끝)과 유사한데 약간의 차이가 있다.
✏️ 예시)
문장의 맨 앞이면서 단어가 3개인 \A... 와 문장의 맨 뒤면서 단어가 3개인 \Z...를 위 예시로 확인할 수 있다.
이 둘과 ^과 $의 차이를 알아보자.
같은 멀티 라인에서도 \A와 \Z는 멀티 라인 전체에서의 가장 처음, 가장 끝만 선택하는 것이다.
^와 $은 모든 줄에서의 처음, 끝을 다 골라주는 점에서 차이가 있다.
(?=<pattern>)
패턴을 포함한 문자를 찾지만 해당 패턴은 선택하지 않는 방식이다.
✏️ 예시)
[Case 1] \w+(?=X)
- 앞에 문자가 오되 '+' 때문에 1~여러 개가 올 수 있다.
- '?='는 뒤에 오는 패턴('X')을 기준으로 찾되 그 패턴은 제외하는 뜻이 된다.
- 따라서 앞에 문자가 1개~여러 개가 오되 뒤에 X가 있는 문자를 찾고, X를 제외했다는 말이 된다.
[Case 2] \w+
- 문자가 1~여러 개 오는 형태로 문자에는 숫자도 포함되기 때문에 111도 선택된다.
[Case 3] \w+(?=\w)
- 앞에 문자가 1~여러 개 오고, 뒤의 문자를 기준으로 찾지만 뒤의 문자는 선택에서 제외한다.
- 그래서 AAAX aaax 111이든 각 단어의 맨 뒤 문자가 선택되지 않은 것이다.
(?!<pattern>)
해당 패턴이 있는 부분을 찾되 그 부분을 아예 선택하지 않는다.
✏️ 예시)
[Case 1] AAA(?!X)
- AAA로 시작하고 X로 끝나는 단어를 찾았지만 이 단어를 선택하지 않고 패턴 밖에 있는 표현식만 반영해 선택했다.
- 그래서 정확히 부합하는 AAAX 대신 패턴이 없는 AAA가 선택됐다.
[Case 2] AAA
- 해당 예시는 AAA가 있는 부분이면 다 선택되므로 Case 1과는 다른 부분을 선택하게 된다.
'👋🏻 JavaScript > 📖 자바스크립트 ES6+' 카테고리의 다른 글
[JavaScript] map() 이란? (0) | 2023.04.25 |
---|---|
[JavaScript] splice와 slice 비교하기 (0) | 2023.04.19 |
[JavaScript] 정규 표현식 공부하기 2 (0) | 2023.03.26 |
[JavaScript] 정규 표현식 공부하기 1 (0) | 2023.03.26 |
[JavaScript] 자바스크립트로 입력 받기 (0) | 2023.03.25 |