17.1 부분 문자열 검색과 대체
정규표현식(정규식)으로 하는 일은 문자열 속에서 부분 문자열을 찾는 일이며
찾은 부분을 교체할 때도 있다.
다만 그 전에, 정규식을 쓰지 않고 검색하고 교체하는 방법인
String.prototype 메서드 검색을 살펴본다,
큰 문자열 안에 원하는 부분 문자열이 존재하는지 여부를 찾을 때 사용
1 | const input = "AS I was going to Saint Ives"; |
이들 메서드는 모두 대소문자를 구분한다.
따라서 input.startsWith("as")는 false 이다.
대소문자를 구분하지 않고 비교하려면 소문자고 바꿔서 비교하면 된다.
1 | const input = "AS I was going to Saint Ives"; |
String.prototype.toLowerCase는 원래 문자열은 그대로 두고 새 문자열을 반환한다.
자바스크립트 문자열은 항상 불변이다.
부분 문자열을 찾아 교체하려면 String.prototype.replace 사용
1 | //String.prototype.replace |
17.2 정규식 만들기
자바스크립트 정규식은 RegExp 클래스이다. RegExp 생성자로도 정규식을 만들 수 있지만, 간편한 리터럴 문법도 있다.
정규식 리터럴은 슬래시(/)로 감싼 형태이다.
1 | const rel1 = /going/; //단어 going을 찾을 수 있는 정규식 |
17.3 정규식 검색
정규식이 만들어지면 다양한 옵션으로 문자열을 검색 할 수 있다.
예) /\w{3,}/ig => 세 글자 이상인 단어에 모두 일치하고, 대소문자를 가리지 않음
1 | const input = "AS I was going to Saint Ives"; |
17.4 정규식을 사용한 문자열 교체
String.prototype.replace 메서드에도 정규식을 쓸 수 있다.
1 | //네 글자 이상으로 된 단어를 모두 교체 |
17.5 입력 소비
정규식이 입력 문자열을 소비하는 패턴이라고 생각하는 것
정규식이 문자열을 소비할 떄 사용하는 알고리즘
- 문자열 왼쪽에서 오른쪽으로 진행
- 일단 소비한 글자에 다시 돌아오지 않는다
- 한 번에 한 글자씩 움직이며 일치하는 것이 있는지 확인한다.
- 일치하는 것을 찾으면 해당하는 글자를 한꺼번에 소비 후 다음 글자로 진행
17.6 대체
1 | //html 페이지를 문자열에 담고, 이 문자열에서 <a>,<area>,<link>,<script>등등을 찾고 싶을 때, 대소문자 상관없이 찾고싶을 때 |
파이프(|)는 대체를 뜻하는 메타 문자이다.
ig는 대소문자를 가리지 않고 전체를 검색하라는 의미이다.
문자열이 겹치는 것이 있을 때는 더 큰것을 먼저 써야한다.
17.7 HTML 찾기
정규식으로는 HTML을 분석할 수 없습니다.
p 태그 안에 a 태그가 존재하는 등의 계층적 구조에 취약합니다.
17.8 문자셋
문자셋은 글자 하나를 다른 것으로 대체하는 방법을 줄인 것
1 | const beer99 = |
17.9 자주 쓰는 문자셋
매우 자주 쓰이는 일부 문자셋은 단축 표기가 있다.
이를 클래스라고 부르기도 한다.

공백문자셋 \s을 써서 줄을 맞출 때가 많습니다.
1 | const stuff = "hight: 9\n" + "medium : 5\n" + "low : 2\n"; |
17.10 반복
반복 메타문자는 얼마나 많이 일치해야하는지 지정할 떄 사용
문자셋 다음의 +는 그 앞에 있는 요소가 하나 이상 있어야한다는 뜻
반복 메타 문자는 그 자체로는 별 의미가 없다.
1 | //숫자 여러개를 찾는 예제 |

17.11 마침표와 이스케이프
정규식에서 마침표(.)는 줄바꿈 문자를 제외한 모든 문자에 일치하는 특수문자입니다.
이 메타문자는 입력이 어떤 문자이든 상관하지 않고 소비하려고 할때 사용
1 | //문자열에서 우편번호만 필요하고 다른것은 필요 없을 때 |
17.11.1 진정한 와일드 카드
마침표가 줄바꿈을 제외한 모든 문자에 일치하면, 줄바꿈 문자를 포함해서 모든 문자에 일치하는 것은 바로 [\s\S]이다.
17.12 그룹
그룹을 사용하면 하위 표현식을 만들고 단위 하나로 취급할 수 있다.
그 그룹에 일치하는 결과를 나중에 사용하도록 캡쳐할 수도 있다.
그룹은 괄호로 만든다. 캡쳐하지 않은 그룹은 (? :[subexpression]) 형태이고, 여기서 [subexpression]이 일치시키려는 패턴이다.
17.13 소극적 일치, 적극적 일치
정규식은 기본적으로 적극적이다. 검색을 멈추기 전에 일치하려는 것을 최대한 많이 찾으려고 한다.
1 | //<i>태그를 <strong> 태그로 바꿀때 |
정규식은 일치할 가능성이 있는 동안 문자를 소비하지 않고 계속 넘어간다 정규식은 를 만나면 를 더 찾을 수 없을 때까지 소비하지 않고 계속 진행한다. 원래 문자열에는 가 두개 있으므로, 정규식은 첫번째 것을 무시하고 그대로 진행
반복 메타 문자 *를 소극적으로 바꾸려면 뒤에 ?를 붙이면된다
17.14 역참조
그룹을 사용하면 역참조라는 테그닉을 사용 가능
서브 그룹을 포함해 , 정규식의 각 그룹은 숫자를 할당 받음
숫자는 맨 왼쪽이 1번에서 시작해서 오른쪽으로 갈수록 1씩 늘어남
역슬래시 뒤에 숫자를 써서 이 그룹을 참조 할 수 있다.
즉, \1은 맨 처음 일치한 그룹이 된다.
따욤표의 짝을 맞출 때 등 사용
17.15 그룹 교체
그룹을 사용하면 문자열 교체도 더 다양한 방법으로 사용가능
17.16 함수를 이용한 교체
함수를 사용하면 복잡한 정규식을 단순화 할 수 있다.
17.17 위치 지정
‘–으로 시작하는 문자열’, ‘–로 끝나는 문자열’ 등을 정규식의 앵커라고 부른다.
- ^는 문자열의 처음
- $는 문자열의 마지막
1 | // ## 17.17 위치 지정 |
17.18 단어 경계 일치
단어 경계 메타 문자인 \b 와 \B는 앵커와 마찬가지로 입력을 소비하지 않는다.
단어 경계는 알파벳 또는 숫자(\w)로 시작하는 부분, 알파벳이나 숫자가 아닌 문자(\W)로 시작하는 부분, 또는 문자열의 시작과 끝에 일치한다.
17.19 룩어헤드
룩어헤드는 입력을 소비하지 않는다.
룩어헤드를 쓰면 정규식 하나로 비밀번호의 유효성을 검사가능하다.
1 | /* |