[머리말]
String 객체의 메서드 중 replace
등에서 첫 번째 인자를 문자열이 아니라 정규 표현식 형태로 줄 수 있다는 것을 알게 되었다. 따라서 이 게시글에서는 MDN 문서를 참조하여 정규 표현식에 대해 알아보고자 한다.
[추가]
정규 표현식은 String의
match()
,matchAll()
,replace()
,replaceAll()
,search()
,split()
메서드와도 함께 사용할 수 있습니다.
- MDN web docs -
String 형 식별자, 즉 String 객체에서 자주 쓰이는 속성/메서드에는 여러가지가 존재한다.
예를 들면 length
, includes
, replace
, replaceAll
, split
, substring
, toLowerCase
, toUpperCase
, trim
, ... 등등이 존재한다.
string을 다룰 때, 특정한 패턴을 바탕으로 string object를 처리하고 싶을 때가 있을 것이다. 이럴 때 유용하게 사용될 수 있는 것이 바로 '정규 표현식(정규식)'이다.
정규 표현식은 문자열에서 특정 문자 조합을 찾기 위한 패턴으로, Java Script에서는 정규 표현식도 객체로 취급한다고 한다. 이 말은 즉슨 객체 생성자를 호출하여 정규 표현식을 만들 수 있다는 말이고, 정규 표현식에 대한 메서드가 존재한다는 뜻이다.
정규 표현식을 만드는 방법은 2가지가 존재한다.
그럼 패턴을 어떻게 구성할 수 있을까? 단순한 패턴으로 구성하는 방법도 있고, 특수 문자를 사용해서 패턴을 구성할 수도 있다.
1. Assertion
Assertions include boundaries, which indicate the beginnings and endings of lines and words, and other patterns indicating in some way that a match is possible (including look-ahead, look-behind, and conditional expressions).
^
: 입력의 beginning과 matche한다. /^A/와 같이 사용한다.$
: 입력의 end와 match한다. /t$/와 같이 사용한다. \b
: b는 boundary를 위미하며, 단어 사이(띄어쓰기 기준) 의 경계를 의미한다.\B
: \b와 반대로 동작한다.x(?=y)
: x 다음에 y가 오는 경우에만 x를 match 한다. match result에는 y가 포함되지 않는다.x(?!y)
: x 다음에 y가 오지 않는 경우에만 x를 match 한다.(?<=y)x
: x 앞에 y가 오는 경우에만 x를 match 한다.(?<!y)x
: x 앞에 y가 오지 않는 경우에만 x를 match 한다.2. Character Classes
Character classes distinguish kinds of characters such as, for example, distinguishing between letters and digits.
[^xyz]
: x, y, z를 제외한 이후에 나오는 첫 문자와 match된다.[xyz]
: x, y, z 에 해당하는 문자와 match된다.\d
: [0-9]와 동일한 의미를 가진다.\D
: \d와 반대의 의미인 [^0-9]를 의미한다..
: line terminators(\n, \r, \u2028 or \u2029)를 제외한 모든 single character와 match한다.\w
: underscore('') 를 포함하여 영숫자(alphanumeric) character와 match한다. [A-Za-z0-9]와 동일한 의미이다.\W
: \w와 반대의 의미인 [^A-Za-z0-9_]를 뜻한다.\s
: single white space character를 의미한다. (space, tab, form feed, line feed, unicode spaces를 포함한다.) [\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] 와 동일한 의미이다.\S
: \s와 반대의 의미인 [^\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] 를 뜻한다.\t
: 수평 탭과 match 된다.\r
: carrige return과 match 된다.\n
: linefeed(enter)와 match 된다.\v
: 수직 탭과 match 된다.\f
: form-feed와 match 된다.[\b]
: backspace와 match 된다.\0
: NULL과 match 된다. (Do not follow this with another digit.)\
: 이 뒤에 나타나는 character가 should be treated specially, or "escaped" 임을 나타낸다. 3. Quantifiers
Quantifiers indicate numbers of characters or expressions to match.
x*
: x가 0번 이상 반복 되는 것을 match한다. x+
: x가 1번 이상 반복 되는 것과 match한다. {1,}과 동일한 의미를 가진다. x?
: x가 0번 또는 1번 나타나는 것과 march 한다.x{n}
: n이 양의 정수일 때, x가 정확히 n번 나타나는 것과 match한다.x{n,}
: n의 양의 정수일 때, x가 최소 n번 나타나는 것과 match한다. x{n,m}
: n이 0 또는 양의 정수이고, m이 양의 정수이며 m>n을 만족할 때, x가 최소 n 이상 m 이하 나타나는 것을 match한다.?
: By default quantifiers like * and + are "greedy", meaning that they try to match as much of the string as possible. The ? character after the quantifier makes the quantifier "non-greedy": meaning that it will stop as soon as it finds a match. 위에서 설명한 것 이외에 추가적인 특수 문자가 궁금하다면 MDN 문서에서 직접 확인해보자.
혹시나 이해가 안되는 부분이 있다면, 직접 작성하며 경험해보는 것이 가장 좋은 방법이다. 직접 하나씩 타이핑 해보며 각 의미를 이해하도록 하자.
[참고 문헌]
자주 쓰이는 정규 표현식 패턴 - https://uznam8x.tistory.com/62
정규 표현식 플레이그라운드 - https://regexr.com/
이런 곳도 참고해보세요!
(소곤소곤) 사실 이건 AI한테 물어보면 엄청 대답 잘 해줍니다:)