January 19, 2020
정규 표현식은 문자열에 나타는 특정 문자 조합과 대응시키기 위해 사용되는 패턴입니다. 자바스크립트에서 정규 표현식 또한 객체입니다.
const birth = '9410o7';
const myRegExp = /^[0-9]+$/;
console.log(myRegExp.test(birth)); // false
문자열에 숫자만 있는지 확인해주는 간단한 예제입니다.
const re = /ab+c/;
정규식 리터럴은 스크립트가 불러와질 때 컴파일됩니다. 만약 정규식이 상수라면, 이렇게 사용하는 것이 성능을 향상시킬 수 있습니다.
const re = new RegExp("ab+c");
생성자 함수를 사용하면 정규식이 실행 시점에 컴파일됩니다. 정규식의 패턴이 변경될 수 있는 경우, 혹은 사용자 입력과 같이 다른 출처로부터 패턴을 가져와야 하는 경우에는 생성자 함수를 사용하세요.
정규식 패턴은 /abc/
와 같이 단순 문자, /Chapter (\d+)\.\d*/
와 같이 단순 문자와 특수 문자의 조합으로 구성될 수 있습니다.
const regExp = /abc/;
console.log(regExp.test("The latest airplane designs evolved from slabcraft."); // true
console.log(regExp.test("Grab crab")) // false
첫번째 문자열은 "abc"
에 대응합니다. 하지만 두번째 문자열은 "ab c"
를 포함하지만 "abc"
를 정확하게 포함하지 않기 때문에 대응되지 않습니다.
특수 문자가 아닌 문자 앞에서 사용된 백슬래시는 ‘해당 문자는 특별하고, 문자 그대로 해석되면 안된다’는 의미.
/b/ // 문자 b
/\b/ // 문자 b가 아닌 단어 경계에 대응하는 특수문자
특수 문자 앞에 위치한 백슬래시는 ‘다음에 나오는 문자는 특별하지 않고 문자 그대로 해석되어야 한다’
/a*/ // 0개 이상의 a문자가 등장함
/a\*/ // 문자 *
RegExp(“patter”)표기를 사용하면 \자체를 이스케이프 해줘야 함
const re2 = new RegExp('a\\*')
// 백슬래시 자체를 이스케이프 함
입력의 시작부분에 대응됩니다.(multi line 플래그가 true면 줄바꿈문자 바로 다음부분과도 대응됨)
const re = /^A/;
console.log(re.test("an A")); //false
console.log(re.test("An E")); //true
[^abc]
는 [^a-c]
와 동일합니다.[a-d]
는 “brisket”의 ‘b’에 일치하고 “city”의 ‘c’에 일치합니다.입력의 끝 부분과 대응됩니다.(multi line 플래그가 true면 줄바꿈문자 바로 앞 부분과도 대응됨)
const re = /t$/;
console.log(re.test("eater")); //false
console.log(re.test("eat")); //true
앞의 표현식이 0회 이상 연속으로 반복되는 부분과 대응됩니다.
const re = /bo*/;
console.log(re.test("A ghost booooed"));// true ('booo'와 대응됨)
console.log(re.test("A bird warbled")); // true ('b'에 대응됨)
console.log(re.test("A goat grunted")); //false (대응되는곳이 없음)
앞의 표현식이 1회 이상 연속으로 반복되는 부분과 대응됩니다.
const re = /a+/;
console.log(re.test("candy")); //true ('a'에 대응됨)
console.log(re.test("caaandy")); //true (모든 'a'들에 대응됨)
console.log(re.test("A goat grunted")); //false (대응되는곳 없음)
?
.
플래그는 옵션이므로 선택적으로 사용합니다. 플래그를 사용하지 않은 경우 첫번째 매칭한 대상만을 검색하고 종료합니다.
Flag | Meaning | Description |
---|---|---|
I | Ignore Case | 대소문자를 구별하지 않고 검색 |
g | Global | 문자열 내의 모든 패턴 검색 |
m | Multi Line | 문자열의 행이 바뀌더라도 계속 검색 |
const str = "11시 20분 32초";
const regExp = /\d+/g;
regExp.exec(str); // [ '11' ]
str.match(regExp); // [ '11', '20', '32' ]
const str = "11시 20분 32초";
const regExp = /\d+(초)/g;
str.match(regExp); // [ '32초' ]
regExp.exec(str); // [ '32초', '초' ]
exec()는 글로벅 플래그를 넣어놔도 일치하는 첫번째 값만 반환합니다. 하지만 캡쳐값이 있을 경우 배열로 반환합니다.