정규표현식(regular expression)은 문자열에서 특정한 문자를 찾아내는 도구이다. 이 도구를 이용하면 수십줄이 필요한 작업을 한 줄로 끝낼 수 있다!
정규표현식은 자바스크립처럼 하나의 언어이며, 수많은 언어들이 정규표현식을 사용한다.
정규표현식 규칙(패턴)을 슬래시(/)로 감싸 사용하며, 슬래시 사이의 문자열을 찾는 명령을 내리는 것이다.
생성자 함수 호출 패턴: let pattern(변수) = new RegExp ('찾고자하는 대상') (소괄호 ('')감싸는 패턴)
let pattern(변수) = /찾고자 하는 대상/
let pattern = /a/;
// /a/ a가 찾고자하는 대상이라는 것을 알려주는 것
RegExp 객체의 생성자 함수를 호출하여 사용한다.
let pattern(변수) = new RegExp ('찾고자하는 대상') (소괄호 ('')감싸는 패턴)
let pattern = new RegExp('a');
// new RegExp 를 사용하여 정규표현식 객체를 만들고 소괄호 속 a를 찾고자한다는 것
찾고자하는 것을 패턴이란 변수에 담고 패턴이란 변수를 통해서 찾고자 하는 것을 사용할 수 있게 되는 것 이다.
정규표현식으로 하는 중요한 작업은 필요한 정보를 추출하는 것, 자신이 확인하고자 하는 정보가 있는지 특정 패턴에 대응하는 문자열을 검색하는 것, 검색된 정보를 다른 정보로 치환하는 것으로 대표적으로 3가지가 있다.
이 작업을 할 수 있는 자바스크립트 내장 메소드와 사용방법을 알아본다.
exec 는 execution 의 줄임말로, 원하는 정보를 뽑아내고자 할 때 사용한다.
찾고자 하는 대상을 첫번째 인자로 전달 하여, 인자 속에 찾고자 하는 대상이 있다면 해당 대상을 값으로 하는 배열을 리턴하며, 찾는 문자열이 없다면 null을 리턴한다.
let pattern = /a/;
pattern.exec('abcde');
// ["a"]
// 찾고자하는 정보 -> 문자열 a
// pattern변수에 'a'를 찾겠다는 의지가 있다.
// .exec 정규표현식을 사용하여 인자에 a가 있는지 찾는다.
// a 가 있으므로 ["a"]를 출력함
let pattern = /a./;
pattern.exec('abcde');
// ["ab"]
// 찾고자하는 정보 -> /a./; 문자열 a와 어떤 문자
let pattern = /a/;
pattern.exec('bcde');
// null
// a 가 없을 경우
찾고자 하는 문자열(인자에)이 대상 안에 있는지의 여부를 boolean 으로 리턴한다.
let pattern = /a/;
pattern.test('abcdef');
// 'abcdef' 인자(문자열)에 a를 포함하고 있어서 true
RegExp.exec() 와 비슷한 기능을 하며, 정규 표현식을 인자로 받아 주어진 문자열과 일치된 결과를 배열로 리턴하며, 일치되는 결과가 없으면 null 을 리턴한다.
let pattern = /c/;
let str = 'codestates';
str.match(pattern);
// str 안에 pattern 이 포함되어 있으므로, ['c'] 를 반환합니다.
'검색 후 바꾸기'를 수행합니다. 첫 번째 인자로는 정규표현식을 받고, 두 번째 인자로는 치환하려는 문자열을 받습니다. 문자열에서 찾고자 하는 대상을 검색해서 이를 치환하려는 문자열로 변경 후 변경된 값을 리턴합니다.
let pattern = /c/; // 첫번째 인자 : 정규표현식
let str = 'codestates'; // 두번째 인자 : 치환하려는 문자열
str.replace(pattern, 'C');
// str 내에서 pattern 을 검색 => 'C' 로 치환하여 그 결과를 리턴
// => 'Codestates'
주어진 인자를 구분자로 삼아, 문자열을 부분 문자열로 나누어 그 결과를 배열로 반환합니다.
"123,456,789".split(",") // ["123", "456", "789"]
"12304560789".split("0") // ["123", "456", "789"]
정규표현식을 인자로 받아 가장 처음 매칭되는 부분 문자열의 위치를 반환합니다. 매칭되는 문자열이 없으면 -1을 반환합니다.
"JavaScript".search(/script/); // -1 대소문자를 구분합니다
"JavaScript".search(/Script/); // 4
"codestates".search(/ode/); // 1
정규표현식은 플래그를 설정할 수 있다.
플래그는 추가적인 검색 옵션의 역할을 하는데, 각자 혹은 함께 사용하는 것이 모두 가능하며, 순서에 구분이 없다.
i를 붙이면 대소문자를 구분하지 않습니다.
let withi = /c/i;
let withouti = /c/;
"Codestates".match(withi); // ['C']
"Codestates".match(withouti); // null
global 의 약자로, g 를 붙이면 검색된 모든 결과를 리턴합니다.
let withg = /c/g;
let withoutg = /c/;
"coolcodestates".match(withg); // ['c', 'c']
"coolcodestates".match(withoutg); // ['c'] g 가 없으면 첫 번째 검색 결과만 반환합니다
m을 붙이면 다중행을 검색합니다.
let str = `1st : cool
2nd : code
3rd : states`;
str.match(/c/gm)
// 3개의 행을 검색하여 모든 c 를 반환합니다.
// ['c', 'c']
str.match(/c/m)
// m은 다중행을 검색하게 해 주지만, g 를 빼고 검색하면 검색 대상을 찾는 순간 검색을 멈추기 때문에
// 첫 행의 ['c'] 만 리턴합니다.
정규표현식의 문법은 그룹과 레인지, 수량, 단어경계, 문자로 총 4가지 그룹으로 나눠볼 수 있다.
Chracter | 뜻 |
---|---|
ㅣ | 또는 (조건 중 하나라도 매칭되는 것) |
() 소괄호 | 그룹지정 |
[] 대괄호 | 대괄호 내의 모든 문자중 하나라도 일치하는 문자를 검색 / ex) [a-z] / a부터 z까지 or [abcde] a부터 e까지 |
[^] | 부정, []안의 문자열 앞에 ^이 쓰이면, []안에 없는 문자를 검색 |
(?:) | 조회하지만 데이터로 기억하지는 않을때 (소괄호 있어도 그룹화되지 X) |
Chracter | 뜻 |
---|---|
? | 없거나 있거나 (zero or one) / ex) codin?g n이 있는 경우 없는 경우 -> codig / coding 모두 조회 |
* | 없거나 있거나 많거나 (zero or more) ex) codin?g -> n이 codinnnng 도 조회 |
+ | 하나 또는 많이 (one or more) / ex) codin?g -=> n 없는 경우 조회 X => codig은 찾지 X |
{n} | n번 반복되는 문자 조회 |
{min,} | 최소 몇번 이상 반복되는 문자 조회 |
{min,max} | 최소, 최대 몇 까지 반복되는 문자 조회 |
Chracter | 뜻 |
---|---|
\b | 단어 첫부분과 끝부분의 경계지정, / ex) \b단어 => 단어 앞에서 있는 문자만 단어 \b => 단어 뒤에 있는 문자만 |
\B | 단어 경계가 아님 \b 정반대 방식 / |
^ | 문장의 시작에서 일치하는 문자 ex) /^abc/ |
$ | 문장의 끝에서 일치하는 문자 ex) /abc$/ |
Chracter | 뜻 |
---|---|
\ (역슬레쉬) | \특수문자, 특수 문자 자체 |
. | 모든 문자(한 문자), 줄바꿈 문자만 제외 |
\w | 모든 문자 검색 |
\W | 문자 아닌 모든 것을 검색 |
\d | digit 숫자 검색 |
\D | 숫자가 아닌 모든 문자 검색 |
\s | space 공백 |
\S | space 공백 아닌 모든것 |
코드스테이츠
생활코딩
드림코딩엘리-정규표현식