[learning javascript] chapter 17. 정규표현식

정규표현식

부분 문자열 검색과 대체

정규식 만들기

정규식 검색

const input = "As I was going to Saint Ives";
const re = /\w{3,}/ig;

// 문자열(input)의 메서드를 사용할 때
input.match(re);    // ["was", "going", "Saint", "Ives"]
input.search(re);   // 5 (세 글자 이상으로 이루어진 첫 단어의 인덱스는 5)

// 정규식(re)의 메서드를 사용할 때
re.exec(input);     // ["was"] (처음 일치하는 것)
re.exec(input);     // ["going"] (exec는 마지막 위치를 기억)
re.exec(input);     // ["Saint"] 
re.exec(input);     // ["Ives"] 
re.exec(input);     // null (일치하는 것이 없음)
re.test(input);     // true (input에는 세 글자 이상으로 이루어진 단어가 1개이상 있음)

// 위 예제는 모두 정규식 리터럴을 그대로 써도 됨
input.match(/\w{3,}/ig);
input.search(/\w{3,}/ig);
/\w{3,}/ig.test(input);
/\w{3,}/ig.exec(input);
// ...

정규식을 사용한 문자열 교체

입력 소비

대체

HTML 찾기

문자셋

자주 쓰는 문자셋

문자셋 동등한 표현 노트
\d [0-9]  
\D [^0-9]  
\s [ \t\v\n\r] 탭, 스페이스, 세로 탭, 줄바꿈이 포함
\S [^ \t\v\n\r]  
\w [a-zA-Z_] 하이픈과 마침표는 포함되지 않으므로
이 문자셋으로 도메인 이름이나 CSS 클래스 등을 찾을 수는 없음
\W [^a-zA-Z_]  

반복

반복 메타 문자 설명 예제
{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는 글자가 있고 그 다음에 숫자가 없거나 있는 경우 일치
* 숫자는 상관없으며 없어도 됨(클레이니 스타, 클로저) /[a-z]\d*/i는 글자가 있고, 그 다음에 숫자가 없어나 있는 경우에 일치
+ 하나 이상 /[a-z]\d+/i는 글자가 있고 그 다음에 숫자가 한 개이상 있는 경우에 일치

마침표와 이스케이프

진정한 와일드카드

그룹

const matches = html.match(/(?:https?)?\/\/[a-z][a-z0-9-]+[a-z0-9]+/ig);

- 정규식 시작에는 캡처하지 않는 그룹 `(?:http?)?`
- 여기에는 0또는 1메타 문자가 두개 있음
- 그 중 처음은 's는 옵션이다'라는 뜻

## 소극적 일치, 적극적 일치
- 정규식은 기본적으로 적극적 일치
- 검색을 멈추기 전에 최대한 많이 찾으려고 함
- HTML텍스트에서 `<i>`태그를 `<strong>`으로 바꿔야 한다면
```javascript
const input = "Regex pros know the difference between\n" +
    "<i>greedy</i> and <i>lazy</i> matching.";
input.replace(/<i>(.*)<\/i>/ig, '<strong>$1</strong>');

역참조

그룹 교체

함수를 이용한 교체

위치 지정

단어 경계 일치

룩어헤드

동적으로 정규식 만들기

요약