정규표현식 (Regular Expression)
정규 표현식은 복잡한 문자열을 처리할 때 사용하는 기법이라고 할 수 있다. Javascript 뿐만 아니라 문자열을 처리하는 모든 곳에서 사용되며, 정규식을 사용하면 훨씬 간편하고 직관적인 코드를 작성할 수 있다.
메타 문자(meta characters)
정규 표현식에서 사용하는 메타 문자(meta characters)에는 대표적으로 이런 것들이 있다. 메타문자를 사용함으로써 정규표현식은 특별한 의미를 갖게 된다.
/^$+?{}[]\|()
[ ]는 문자 클래스(character class)이다. 즉, [ ] 사이의 문자들과의 매치를 의미한다.
예를 들어, [hot]라는 정규 표현식은 h,o,t중 한 개의 문자라도 들어가 있다면 매치되는 것으로 인정한다는 뜻이다.
따라서 'abc'라는 문자열은 겹치는 문자가 한 개도 없기 때문에 매치되지 않고, 'cold'라는 문자열은 'o'가 포함되기 때문에 [hot] 표현식과 매치된다.
자주 사용하게 될 것 같은 문자 클래스를 정리하면 다음과 같다.
참고로 ^는 not, -는 범위를 의미하며, 대문자와 소문자가 서로 반대되는 의미라는 것도 추측할 수 있다.
\d | 숫자와 매치, [0-9] |
\D | 숫자가 아닌것과 매치, [^0-9] |
\s | 공백 문자(whitespace)와 매치, [\t\n\r\f\v] |
\S | 공백문자가 아닌 것과 매치, [^\t\n\r\f\v] |
\w | 문자+숫자와 매치, [a-zA-Z0-9] |
\W | 문자+숫자가 아닌 것과 매치, [^a-zA-Z0-9] |
\A | 문자열의 처음과 매치 (^와 비슷) |
\Z | 문자열의 끝과 매치 ($와 비슷) |
Dot(.)은 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
예를 들어 a.b라는 정규 표현식은 "a+(모든문자)+b"를 의미하는 것이라고 할 수 있다. 주의할 점은 적어도 하나의 문자가 사이에 들어가야한다는 것이다. aab, a0b 등은 a와 b사이에 임의의 문자가 들어가기 때문에 매치되지만, abc는 a와 b사이에 아무 문자도 없기 때문에 매치되지 않는다.
*은 반복을 의미하는 메타 문자이다. *의 바로 앞에 있는 문자는 0부터 무한대로 반복될 수 있다. 예를 들어, do*g이라는 표현식은 dg(0번 반복), dog(1번 반복), dooooog(5번 반복) 등의 문자열과 매치된다.
+도 반복을 의미하는 메타 문자이다. *과 다른 점은 최소 1번 이상 반복되어야 사용이 가능하다는 것이다. do+g이라는 표현식은 dg(0번 반복)과는 매치되지 않고 dog(1번 반복), dooooog(5번 반복) 등의 문자열과는 매치된다.
{m,n} 도 반복을 의미하는데, 앞의 메타문자들과는 달리 반복 횟수를 m부터 n까지로 지정할 수 있다. m과 n을 생략하게 되면 이상, 이하라는 의미를 갖게 된다. 조금 응용해서 생각해보면 {1,}는 +와 동일하고, {0,}은 *과 동일한 기능을 한다는 것을 알 수 있다.
?도 정확히는 반복을 의미하는 것은 아니지만 반복과 비슷한 의미를 가지고 있다. ?는 {0,1}을 의미한다.없어도되고(0), 있어도된다(1)는 뜻이라고 할 수 있다.
*, +, ? 메타 문자들은 모두 {m,n} 형태로 표현이 가능하지만, 그대로 기호로 표시하는 것이 좀 더 이해하기 쉽고 표현도 간결한 것 같다.
( )는 그루핑(Grouping)을 의미하는 메타 문자이다. 일정 길이의 문자열이 계속해서 반복되는지 조사하는 경우 유용하게 사용할 수 있다.
예를 들어, dog라는 문자열이 반복되는지 조사하고 싶다면, (dog)+라는 표현식을 사용해 조사하면 된다.
이름+" "+전화번호 형태의 문자열을 찾고싶다면, (r"\w+\s+\d+[-]\d+[-]\d+") 이런식의 표현식을 사용할 수 있다. 문자열의 시작부분을 뜻하는 (\w+)부분이 이름 부분에 해당하고, (\d+[-]\d+[-]\d+)부분이 전화번호 부분을 의미하는 것이다.
이외에도 이처럼 정규 표현식에서 사용되는 메타문자들이 많이 존재한다.
match()
정규 표현식과 관련된 대표적인 메서드로 match가 있다.
match는 문자열이 정규 표현식과 매치되는 부분을 검색하는 메서드이다.
문자열이 정규 표현식과 일치하는 경우 일치하는 전체 문자열을 첫 번째 요소로 포함하는 배열을 반환하고, 일치하는 것이 없는 경우에는 null을 반환한다.
str.match(regexp) var str = 'For more information, see Chapter 3.4.5.1';
var re = /see (chapter \\d+(\\.\\d)*)/i;
var found = str.match(re); console.log(found);
// logs [ 'see Chapter 3.4.5.1',
// 'Chapter 3.4.5.1',
// '.1',
// index: 22,
// input: 'For more information, see Chapter 3.4.5.1' ]
'Language > Javascript' 카테고리의 다른 글
Primitive Type(원시 자료형), Reference Type(참조 자료형) (2) | 2020.12.16 |
---|---|
parseFloat, Number의 차이점 (1) | 2020.12.10 |
문자열 관련 메서드 (0) | 2020.12.10 |
기억해야 할 6가지 falsy 값 (0) | 2020.12.10 |
변수(Variable)와 데이터 동작 원리 (0) | 2020.12.09 |
댓글