어제 정리했던 Date 객체에 이어 웹 문서 작성 시 유용하게 쓰이는 정규표현식(Regular Expression)을 공부했다.
정규표현식(Regular Expression)은 '문자열'에서 특정 문자나 내용을 찾거나 대체 또는 추출하는 데에 사용되는 식이다. 예를 들어 웹 사이트 가입 시 아이디나 비밀번호를 입력할 때 조건에 맞지 않는 문자를 작성했는지 확인하는 방법에 활용될 수 있다.
정규표현식은 사용이 간단하여 controls statement와 같은 복잡한 코드를 짜지 않아도 된다는 장점이 있지만 공백을 허용하지 않으면서 여러가지 기호를 혼합해 사용하기 때문에 가독성이 좋지 않다.
- 리터럴 표기법
/pattern/flag
'/'기호로 시작과 끝을 나타내고 그 사이에는 찾고자 하는 문자의 패턴, 그리고 선택적으로 플래그를 뒤에 붙여 찾는 방식의 옵션을 넣을 수도 있다.
- 리터럴 방식
let reEx = /pattern/flag
'/'기호로 시작과 끝을 나타내고 그 사이에는 찾고자 하는 문자의 패턴, 그리고 선택적으로 플래그를 뒤에 붙여 찾는 방식의 옵션을 넣을 수도 있다.
- 생성자 함수 방식
new RegExp('pattern', 'flag'); new RegExp(/pattern/flag);
주로 리터럴 방식을 사용하지만
RegExp
를 사용 할 수도 있다. 정규식의 패턴이 변경될 수 있는 경우, 혹은 사용자 입력과 같이 다른 출처로부터 패턴을 가져와야 하는 경우 사용한다.
정규 표현식에서 사용되는 메소드는 정규표현식 메소드와 정규표현식의 적용 대상이 되는 문자열에 대한 메소드로 나누어 진다.
let targetStr = 'Something is happening' let regExp = /ing/ig;
- RegExp.exec() - 어떤 문자열에서 정규표현식과 일치하는 문자열 검색을 수행해 배열이나 null을 반환한다.
regExp.exec(targetStr) // ["ing", index: 6, input: "Something is happening"]
- RegExp.test() 대상 문자열 속에 일치하는 문자열이 포함되어 있는지 검사하고 true 또는 false를 반환한다.
regExp.test(targetStr) // true
let targetStr = 'Something is happening' let regExp = /ing/ig;
- String.match() - 문자열이 정규식과 매치되는 부분을 검색한다.
targetStr.match(regExp); // ["ing", "ing"]
- String.replace() - 대응되는 문자열을 찾아 다른 문자열로 치환한다.
targetStr.replace(regExp, 'ING'); // "SomethING is happenING"
- String.search() - 대응되는 문자열이 있는지 검사해 대응된 부분의 인덱스를 반환한다. 대응되는 문자열을 찾지 못했다면 -1을 반환한다.
targetStr.search(regExp); // 6
- String.split() - 정규식 혹은 문자열로 대상 문자열을 나누어 배열로 반환한다.
targetStr.split(regExp); // ["Someth", " is happen", ""]
패턴에는 타겟이 되는 문자열에서 검색하고 싶은 문자열의 조건을 지정한다. 패턴은 특별한 의미를 가지는 메타문자(Metacharacter) 또는 기호로 표현할 수 있다.
플래그는 정규표현식에 선택적으로 사용하는 옵션이다. 플래그를 사용하지 않은 경우 문자열 내 검색 매칭 대상이 1개 이상이더라도 첫번째 매칭한 대상만을 검색하고 종료하고 문자열의 행이 바뀌면 정규표현식의 대상이 되지 않는다. 플래그로 이 점을 무력화 할 수 있다.
- i - 대소문자 구분 없이 검색한다.
- g - 문자열 내의 모든 패턴을 검색한다.
- m - 문자열의 행이 바뀌더라도 검색을 계속한다.
let targetStr = 'Something is happening to BINGBING'; let regExp1 = /ing/; targetStr.match(regExp); // ["ing"] let regExp2 = /ing/ig; targetStr.match(regExp); // ["ing", "ing", "ING", "ING"]