전체 페이지뷰

2016년 11월 30일 수요일

Regular expression 3

Alternation

지금까지 하나의 문자 집합으로부터 한개의 문자를 일치시키는 법을 알아보았습니다.
이제부터 pipe 심볼 | 을 이용해서 좀 더 복합적인 예들을 알아보겠습니다.

/yes|no/  :yes 나 no 중 매치 되는 것

/yes|no|maybe/ :두 개 이상도 가능합니다

/licence:-->yes|no/
이 경우에는 혼동이 있을 수 있습니다. 얼핏 생각하기에 "licence: yes" or "licence: no"라고도 착각할수 있지만 이것은 "licence: yes" or "no"입니다.(앞에 말했다시피 -->는 공백문자입니다. ) 정확하게 표현하려면 괄호를 써서 /licence: (yes|no)/라고 해야 합니다.


Quantifier

반복의 뜻을 나타내는 방법을 알아보겠습니다.
예를 들어 \d(숫자를 뜻하는 클래스)를 반복 시킬수 있다면, 쇼핑 카트내의 아이템 목록의 수를 나타내는 validator form을 손쉽게 만들 수 있을 것입니다.
그러나, 일단 기초적인 것부터 시작해봅시다.

?는 있거나 없거나를 나타내며, *는 0이상의 횟수, +는 1이상의 횟수, {n,m}은 n번에서 m번의 반복을 나타냅니다.

/cars?/ 는 어떤 뜻일까요?
?는 바로 앞의 항목에만 적용됩니다. cars 전체에 적용되는 것이 아니라는 뜻입니다.
따라서 cars 이거나 car 라는 뜻이 되겠지요.

아직 자세히 배우지 않았지만 grouping 문법을 추가하여,
전화번호 555-555-5555, 555 555 5555, 5555555555 를 모두 맞는 양식으로 판정하기 위해 정규표현식을 써봅시다.

/\d+[-\s]?\d+[-\s]?\d+/ 가 됩니다.
 숫자(\d)가 한개 이상(+) 이어지고, 그 뒤에 -(-)이나 공백(\s) 중에 하나([ ])가 있을 수도 있고 없을 수도 있고(?)....라는 뜻입니다.
위의 식을 표로 설명하면 다음과 같습니다.

이제 { } 를 이용하여 range를 표현해 보겠습니다.

/\w{3}/ 은 영어나 숫자(\w) 3회 반복({3})이라는 뜻입니다.
/a{1,3}b/ 는 a가 1회 이상 3회 이하 나타나고 b가 온다는 뜻입니다. (ab, aab, aaab)

처음을 0, 끝을 무한으로 설정하여 앞과 뒤의 수는 생략 가능합니다.
따라서 {,3}은 최대 3회, {3,}는 최소 3회라는 뜻입니다.

Tip. 코드를 읽기 쉽게 하기 위해 {,1} 대신에 ?, {0,} 대신에 *, {1,} 대신 +를 쓰도록 합니다. 
틀린 것은 아니지만 이해하기에 시간이 걸릴 수도 있습니다.

표로 정리하면 이렇습니다.

아까 나온 전화번호 양식을 좀 더 세밀하게 다듬어 볼까요?
/\d{3}[-\s]?\d{3}[-\s]?\d{4}/ 가 됩니다.

댓글 없음:

댓글 쓰기