-
들어가기전에
정규식은 특정 문자열을 찾고, 이를 특정한 내용을 바꿀 때 "매우 매우" 유용하게 사용됩니다.
실제로 정규식을 사용 하고는 싶었으나 ! 이해가 어려워서 미루고 있던 도중 강의를 만나게 되어 ! 정리를 하게 되었습니다.
1. 정규식 생성하기
정규식의 생성은 아래와 같이 "//" 로 감싼 뒤, 변수에 담아두는 방식과
const regExp = /abc/;
다음과 같이 생성자를 이용하여 만들 수 있습니다.
const regExp = new RegExp("abc");
2. 정규식 사용법
특수 문자
특수문자는 \(백슬래쉬)를 앞에 붙여 줌으로써, 특수문자가 그대로 사용 될 수 있도록 해야합니다.
const regExp1 = /\*/; const regExp2 = /\?/;
플래그
조금 더 섬세한 패턴을 찾기 위해서는 마지막 / 뒤에 특정 플래그를 사용합니다.
- 전역 검색 ( Global )
모든 검색 결과를 배열로 반환합니다.
const str = "abcabc" str.match(/a/g); // (2) ["a", "a"]
- 대소문자 구분 X
const str = "abcabc" str.match(/a/g); // (2) ["a", "a"]
메타문자
- 문자 그룹 ( Character Set ) : []
[] 내부의 문자열이 하나라도 일치 하는 값들을 반환 해줍니다 :D
const str = "rad and red"; str.match(/r[ae]d/g); // (2) ["rad", "red"]
이 때, 대괄호 내부에 들어가는 특수문자는 메타 문자로 취급되지 않기 때문에, 별도의 이스케이프를 하지 않아도 됨니다.
const str = "!@#!#@#!"; str.match(/[!.?]/g);
문자 그룹에서 연속된 문자열을 보여주고 싶다면, -를 이용해서 간단하게 표현 할 수 있습니다.
const alpha_regExp = /[A-Z]/; const num_regExp = /[0-9]/; const han_regExp = /[가-힣]/;
10진수 문자 ( Digit Character : \d )
10진수 문자열을 나타내는 /d 정규식은 위에서 언급했던 [0-9]와 같은 기능을 수행합니다.
- 단어 문자 ( \w )
단어문자는 영어 대,소문자 숫자 그리고 언더스코어를 포함하는 그룹 ( [ 0-9a-zA-z] ) 와 동일한 기능을 수행합니다.
const str = "2021 08 05 kim"; str.match(/w/g); // 모든 값을 출력 str.match(/W/g); // 공백만을 출력
- 공백 문자 ( \s )
공백인 값을 출력하고, S(대문자) 의 경우는 대문자가 아닌 모든 값을 출력합니다.
- 앵커 ( Anchor, ^, $ )
앵커는 어떤 특정 위치에서 동작 할지를 제한 하는 역할을 수행합니다.
// 여러 `w` 중에서 문자열의 시작 부분과 일치하는지를 확인합니다 const str = "www"; // 가장 첫 번째 `w` 만 반환됩니다 str.match(/^w/); // ["w", index: 0, input: "www", groups: undefined] // 가장 마지막 `w` 만 반환됩니다 str.match(/w$/); // ["w", index: 2, input: "www", groups: undefined]
보시는 것 처럼 [^] 는 시작 위치를 의미하고, [$] 는 끝을 의미합니다.
- 단어 경계 ( \b )
다른 단어 문자가 앞이나 뒤에 등장하지 않는 위치임을 나타내는 문자입니다.
const str = "create or ate"; // 'ate' 의 좌우로 단어 문자가 없는 것만을 찾습니다. str.match(/\bate\b/g); //[ 'ate' ] str.match(/\Bate\b/); [ 'ate', index: 3, input: 'create or ate', groups: undefined ]
- 숫자 일치
- n번 일치 ( {n} )
const str = "abcaabc" str.match(/a{1}b/); // ["ab"] str.match(/a{2}b/); // ["aab"]
- n번 이상 m번 이하 일치
const str = "aaaaa" str.match(/a{1,3}b/); // ["aaa"]
적어도 n번 일치
const str = "aaaaa" str.match(/a{1, }b/); // ["aaa"]
그룹화
특정 부분을 단일 표현식으로 구분 짓기 위해 사용됩니다.
const str ="aaabbabab" // 이 표현식은 [ab, abb, abbb..] 을 검색합니다. str.match(/ab+/g); // 이 표현식은 [ab, abab, abab..] 을 검색합니다. str.match(/(ab)+/g);
3. 정규식 메소드 ( Regular Expression Method )
1. test
test는 특정 문자열 내부에, 정규식과 일치하는 내용이 있는지 유무를 파악 하는데 사용됩니다.
const message2 = "안녕하세요. 010-1234-5687 말고 010-9876-5432으로 연락주세요"; // \d는 숫자를 의미하고, {} 안의 숫자는 갯수를 의미합니다. const regExp = /\d{3}-\d{3,4}-\d{4}/; // test => true || false console.log(regExp.test(message));
2. exec
exec 함수는 정규식에 일치하는 내용의 위치와 정보를 출력 합니다.
const message = "안녕하세요. 010-1234-5678 으로 연락주세요."; const regExp = /\d{3}-\d{3,4}-\d{4}/; // exec => pattern에 일치한 문자열과 위치 console.log(regExp.exec(message));
// output [ '010-1234-5678', index: 7, input: '안녕하세요. 010-1234-5678 으로 연락주세요.', groups: undefined ]
3. match
match는 exec과 같은 정보를 출력합니다.
다만, 문자열에 메소드를 붙여서 사용한다는 점에서 차이가 있다고 말씀 드릴 수 있습니다.
// pattern에 일치한 문자열과 위치 및 정보 출력 console.log(message.match(regExp));
// output [ '010-1234-5678', index: 7, input: '안녕하세요. 010-1234-5678 으로 연락주세요.', groups: undefined ]
4. replace
replace는 정규식에 해당되는 내용을 변경 시키는 역할을 수행합니다.
const message = "안녕하세요. 010-1234-5678 으로 연락주세요."; const message2 = "안녕하세요. 010-1234-5687 말고 010-9876-5432으로 연락주세요"; // replace는 일치되는 부분을 원하는 내용, 값으로 변경 console.log(message.replace(regExp, "전화번호")); // 모두 변경 하고 싶다면, /g 을 붙여주자 ! console.log(message2.replace(/\d{3}-\d{3,4}-\d{4}/g, "전화번호"));
// output 안녕하세요. 전화번호 으로 연락주세요. 안녕하세요. 전화번호 말고 전화번호으로 연락주세요
5. 압축 ( Run-length-Encoding )
이러한 정규식을 바탕으로, 다음과 같이 압축을 하는 방법도 존재합니다 :D
const raw = "AAAAABBBCCCCDDFFFKKK"; const raw_regExp = /(.)\1*/g; const result = raw .match(raw_regExp) .reduce((a, b) => a + `${b.length}${b.slice(0, 1)}`, ""); console.log(result); // 5A3B4C2D3F3K
참조
https://wormwlrm.github.io/2020/07/19/Regular-Expressions-Tutorial.html
https://ko.javascript.info/regexp-introduction
'Develop > JavaScript' 카테고리의 다른 글
[ JavaScript ] 변수란? (0) 2021.08.17 이터레이터 & 제네레이터 ( iterator & generator ) (0) 2021.08.09 [ JavaScript ] 실행 컨텍스트 (Execution Context) (0) 2021.07.19 [ JavaScript ] let vs var (0) 2021.07.14 [ JavaScript ] This 란 ? (0) 2021.07.14 댓글