얼마 전까지만 해도 for문으로 문자열을 탐색, 교체했는데 정규표현식을 사용하니 써야 할 코드가 많이 줄어서 좋다. 기호들이 들어가다 보니 가독성은 별로긴 하지만, 여러모로 사용할 것 같으니 미리 정리해둔다.
정규 표현식
- 일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어.
- 문자열을 대상으로 특정 패턴과 일치하는 문자열을 검색하거나 추출 또는 치환할 수 있는 기능을 제공한다.
- 반복문과 조건문 없이 패턴을 정의하고 테스트할 수 있다.
- 주석이나 공백을 허용하지 않고 여러 가지 기호를 혼합하여 사용하기 때문에 가독성이 좋지 않다.
정규 표현식의 생성
슬래쉬( '/' ) 를 이용해 열고 닫고, 플래그를 이용해 검색 방식을 설정한다.
let text = "Today is wednesday";
let regexp = /is/i;
console.log(regexp.test(text)) //true
test 메서드는 인수로 전달받은 문자열에 대해 정규 표현식의 패턴을 검색하여 매칭 결과를 불리언 값으로 반환한다.
match 메서드는 대상 문자열과 인수로 전달받은 정규 표현식과의 매칭 결과를 배열로 반환한다.
플래그
패턴과 함께 정규 표현식을 구성하는 플래그는 정규 표현식의 검색 방식을 설정하기 위해 사용한다.
플래그 | 의미 | 설명 |
i | Ignore case | 대소문자를 구별하지 않고 패턴을 검색한다. |
g | Global | 대상 문자열 내에서 패턴과 일치하는 모든 문자열을 전역 검색한다. |
m | Multi line | 문자열의 행이 바뀌더라도 패턴 검색을 계속한다. |
let text = "Is this all there is?";
let i = /is/i // 'is' 문자열을 대소문자 구별없이 한 번만 검색
console.log(text.match(i));
// [ 'Is', index: 0, input: 'Is this all there is?', groups: undefined ]
let g = /is/g // 'is' 문자열을 대소문자 구별해서 전역 검색
console.log(text.match(g));
// [ 'is', 'is' ]
let ig = /is/ig // 'is' 문자열을 대소문자 구별없이 전역 검색
console.log(text.match(ig))
// [ 'Is', 'is', 'is' ]
패턴
반복검색
1. {m, n}
최소 m번, 최대 n번 반복되는 문자열을 의미한다.
let text = "A AA B BB Aa Bb AAA";
console.log(text.match(/A{1,2}/g)); //[ 'A', 'AA', 'A', 'AA', 'A' ]
2. {n}
n번 반복되는 문자열을 의미한다.
let text = "A AA B BB Aa Bb AAA";
console.log(text.match(/A{2}/g)); //[ 'AA', 'AA' ]
3. {n,}
최소 n번 이상 반복되는 문자열을 의미한다.
let text = "A AA B BB Aa Bb AAA";
console.log(text.match(/A{2,}/g)); //[ 'AA', 'AAA' ]
4. +
패턴이 최소 한번 이상 반복되는 문자열을 의미한다. 즉, +는 {1,}과 같다.
let text = "A AA B BB Aa Bb AAA";
console.log(text.match(/A+/g)); //[ 'A', 'AA', 'A', 'AAA' ]
OR검색
1. '|'는 or의 의미를 갖는다.
let text = "A AA B BB Aa Bb AAA";
console.log(text.match(/A|B/g)); //['A', 'A', 'A', 'B','B', 'B', 'A', 'B','A', 'A', 'A']
// 한번만 나오는 경우로 끊어서 찾기때문에 분해되어 나온다.
// +를 넣어 한번이상인 단어로 찾도록하면 해결된다.
console.log(text.match(/A+|B+/g)); //['A', 'AA','B', 'BB','A', 'B','AAA']
2. 이런 패턴은 []를 사용해 간단히 표현할 수 있다, [] 내의 문자는 or로 동작한다.
let text = "A AA B BB Aa Bb AAA";
console.log(text.match(/[AB]+/g)); //['A', 'AA','B', 'BB','A', 'B','AAA']
3. [] 내에 '-'를 사용해서 범위를 지정할 수 있다.
let text = "A K 33,123 Aa Bb AAA";
console.log(text.match(/[A-Za-z]+/g)); //[ 'A', 'K', 'Aa', 'Bb', 'AAA' ]
// '[]' 내부는 or로 동작하기 때문에 A-Z or a-z와 같다. 즉 대문자 소문자 모두 탐색하게 된다.
console.log(text.match(/[0-9,]+/g)); // [ '33,123' ]
// '[]' 안에 ','가 포함되지 않으면, ['33','123'] 로 분해되어 출력된다.
4. 위 내용들은 \d, \w로 쉽게 표현 가능하다. \d는 숫자를 의미하고, \w는 알파벳, 숫자, 언더스코어를 의미한다.
\d === [0-9]
\w === [A-Za-z0-9_]
let text = "A K 33,123 Aa _#@ AAA";
console.log(text.match(/[\w,]+/g)); //[ 'A', 'K', '33,123', 'Aa', '_', 'AAA' ]
console.log(text.match(/[\d,]+/g)) //[ '33,123' ]
NOT검색
'[]' 내에 있는 '^'는 not을 의미한다. 즉 [^0-9]는 숫자를 제외한 모든 문자를 의미한다.
let text = "A K 33 Aa _#@ AAA";
console.log(text.match(/[^\d]+/g)) //[ 'A K ', ' Aa _#@ AAA' ]
시작, 마지막 위치 검색
'[]' 밖의 '^'는 문자열의 시작을, '$'는 문자열의 마지막을 의미한다.
let test = "https://poylib.tistory.com/"
console.log(/^https/.test(test))
console.log(/com\/$/.test(test))
출처 : Deep dive
'Programing > Javascript' 카테고리의 다른 글
[JS] Array vs. Set (0) | 2022.06.12 |
---|---|
[JS] Set & Map (0) | 2022.06.03 |
[JS] 구조 분해 할당 (0) | 2022.05.18 |
<JS> 자바스트립트로 HTML수정 (0) | 2022.04.20 |
<JS> for문 탐색 (0) | 2022.04.08 |