17.10 반복
반복(repetition) 메타 문자는 얼마나 많이 일치해야 하는지 지정할 때 씁니다.
역주_
수량자라는 표현을 사용한 책이 많습니다.
앞에서 우리는 숫자 한 개를 찾는 예제를 봤었습니다.
그런데 숫자 여러 개를 찾아야 한다면 어떨까요?
이미 알고 있는 방법을 사용해서 다음과 같이 찾을 수 있습니다.
const beer99 = "99 bottles of beer on the wall " + "take 1 down and pass it around -- " + "98 bottles of beer on the wall.";
const match = beer99.match(/[0-9][0-9][0-9]|[0-9][0-9]|[0-9]/);
// const match = beer99.match(/[0-9][0-9][0-9]|[0-9][0-9]|[0-9]/g);
이번에도, 두 자리 숫자가 숫자를 소비해서 세 자리 숫자를 찾지 못하는 일이 없도록 세 자리 숫자를 먼저 썼습니다.
이 정규식은 한 자리, 두 자리, 세 자리 숫자에는 잘 동작하지만 네 자리 숫자가 필요하다면 정규식을 또 고쳐야 합니다.
다행히 더 나은 방법이 있습니다.
const beer99 = "99 bottles of beer on the wall " + "take 1 down and pass it around -- " + "98 bottles of beer on the wall.";
const match = beer99.match(/[0-9]+/);
// const match = beer99.match(/[0-9]+/g);
문자셋 다음의 +
는 그 앞에 있는 요소가 하나 이상 있어야 한다는 뜻입니다.
반복 메타 문자는 그 자체로는 아무 의미도 없습니다.
반복 메타 문자에는 다섯 가지 종류가 있습니다.
반복 메타 문자 | 설명 | 예제 |
---|---|---|
{n} | 정확히 n개 | /\d{5}/ 는 새 우편번호처럼 정확히 다섯 자리 숫자에만 일치합니다. |
{n, } | 최소한 n개 | /\d{5,}/ 는 다섯 자리 이상의 숫자에만 일치합니다. |
{n, m} | n개 이상, m개 이하 | /\d{2,5}/ 는 2개, 3개, 4개, 5개에 일치합니다. |
? | 0개 또는 1개, {0,1}와 동등합니다. | /[a-z]\d?/i 는 글자가 있고 그 다음에 숫자가 없거나 한 개 있는 경우에 일치합니다. |
* | 숫자는 상관없으며 없어도 됩니다(클레이니(Klene) 스타, 클레이니 클로저라고 부르기도 합니다). | /[a-z]\d*/i 는 글자가 있고 그 다음에 숫자가 없거나 있는 경우에 일치합니다. |
+ | 하나 이상 | /[a-z]\d+/i 는 글자가 있고 그 다음에 숫자가 한 개 이상있는 경우에 일치합니다. |