본문 바로가기
Javascript

자바스크립트(javascript) 내장 객체 - 정규식 객체

by 램쥐뱅 2017. 4. 4.

정규식은 자바스크립트 라이브러리를 만들 때 아주 유용한 도구다.

경우에 따라서는 아주 복잡하고, 수많은 로직의 코드를 단 몇 줄로 끝낼 수도 있다.

정규식은 검색하고자 하는 문자열의 패턴을 정의하는 풍부한 문법을 제공한다. 정의된 패턴은 지정한 문자열을 대상으로 패턴 매칭(pattern matching)을 수행하고 검색, 치환, 추출하는 작업에 사용된다.



정규식 객체를 사용하는 정파를 정리하면 다음과 같다.


정규식 정의(패턴+한정자)->정규식 객체->패턴 매칭->검색,추출,대체




정규식 객체 생성 - new RegExp, 리터럴


var re = new RegExp('h.*o', 'gmi');     // 생성자 이용

var re = /\bh.*lo\b/i;                // 리터럴 이용


var re = new RegExp("\\bh.*o\\b,"i");

var re = /\b h.*lo\b/i;


RegExp 생성자를 이용하려면 백슬래시를 이스케이프하기위해 두개의 백슬래시를 사용해야하는 불편함 등이 있다. 그래서 실제로는 정규식 리터럴이 편리하여 많이 사용된다.


RegExp 두번째 인자 그리고 리터럴의 마지막 / 문자 뒤에는 한정자(modifier 또는 flag)가 올수있다. ex) /\bh.*lo\b/gi

자바스크립트에서는 i, g, m으로 3가지의 한정자가 있다.


 한정자

 의미 

 i (ignore case) 

 패턴 매칭을 수행할 때 대소문자를 구분하지 않는다.

 g (global match)

 전역 매칭, 첫 번째로 일치하는 문자열이 검색되더라도 패턴 매칭을 중지하지 않고 전체 텍스트에 대해 모든 일치하는 문자열을 찾는다. ex) JAVA .replaceAll()

 m (multilines)

 멀티 라인모드. 개행문자(\n or \r)가 포함되어 있는 텍스트는 한문장으로 보지않고 여러문장으로 구성되어 있는것으로 간주한다. 따라서 검색 패턴에 패텅의 시작(^) 문자와 끝 문자($)가 호함되어 있다면 개행 문자로 분리된 매 라인마다 시작과 끝문자를 일치시킨다.




패턴 매칭 수행 - 정규식 객체


RegExp 객체가 생성되면 패턴 매칭을 수행할 수 있다.

이를 위해 RegExp 객체에서는 exec(), test() 두개의 메서드를 제공한다.


exec()


exec() 메서드는 인자로 전달된 문자열에 패턴 매칭을 수행해 정규식 객체가 가지고 있는 패턴과 매칭된 결과를 검색한다.

패턴에 매칭된 결과를 찾으면 배열로 반환하고, 그렇지 못하면 null을 반환한다.


var re = /\bh.*o\b/i;

var text = "hello world, heyo";

re.exec(text) -> ["hello world, heyo"]


exec() 메서드는 한정자 g가 있든 없든 항상 매칭된 결과를 배열로 반환한다.

exec() 가 반환하는 결과 객체의 속성은 다음과 같다.


 속성 

 결과 

 결과객체[0]

 매칭된 전체 텍스트를 반환한다.

 결과객체[1], 결과객체[2]...

 매칭된 전체 텍스트 가운데 첫 번째, 두 번째.. 괄호의 패턴(\w+)으로 부분 매칭된 문자열을 반환한다. 한정자 g를 참조한다. 

 결과객체.length 

 일반 배열 객체처럼 요소의 개수, 즉 배열의 크기를 나타낸다. 

 결과객체.index

 매칭된 문자열의 첫 번째 위치를 나타낸다.



test()


test() 메서드는 단지 패턴에 매칭된 결과가 있는지 없는지를 boolean 값으로 반환한다.

매칭된 결과가 있다면 true를 반환하고 그렇지 않다면 false를 반환한다.

단지 매칭된 결과가 있는지 없는지만 알고 싶다면 성능상 test()를 사용하는 것이 바람직하다.




패턴 매칭 수행 - String 객체


자바스크립트에서는 RegExp 객체 말고도 String 객체를 이용해 패턴 매칭을 수행해서 검색과 대체 작업을 할 수 있는 수단을 제공한다.

String 객체에서는 정규식을 사용하는 4가지 메서드로 search(), replace(), match(), split()을 제공한다.


search()


search() 메서드는 정규식 리터럴을 인자로 받을 수 있는데, 이 메서드는 현재 문자열에서 패턴에 매칭되는 첫 번째 부분 문자열의 위치를 반환한다. 매칭되는 부분이 없다면 -1을 반환한다.


"Hello world".search(/\bh.*o\b/i); -> 0반환


search() 에 전달되는 인자가 정규식이 아니면 인자는 먼저 RegExp 생성자를 통해 정규 객체로 변환된다.

search()는 한정자 g를 지원하지 않는다. 만약 정규식 표현에 g가 있다면 무시한다.




replace()


replace() 메서드는 검색과 대체를 수행한다. 첫 번째가 정규식인자고 두번째는 대체될 문자열을 인자로 받는다.

첫 번째 인자로 문자열이 전달되면 search() 처럼 RegExp 생성자를 이용해 문자열 정규식 객체로 변환하지 않는다. 대신 인자로 전달된 문자열을 그대로 검색하는데 사용한다.


한 가지 중요한 특징은 대체될 문자열을 제공하는 두 번째 인자가 상수나 변수가 아니고 함수일 수도 있다는 것이다.

이것은 대체 문자열을 동적으로 계산해서 만들어 낼 수 있다는 의미다. 긴 텍스트에서 특정 패턴의 문자열을 찾아서 새로운 문자열로 변경하는 작업을 할 수 있는 능력은 매우 유용하게 활용할 수 있다.


"Hello world".replace("Hello",""); -> "world"

"Hello world".replace(/l/gi,""); -> "Heo world"




match()


match() 메서드는 인자를 정규식으로 받아 (정규식이 아니면 Regexp 생성자를 이용해 정규식 객체로 변환한다) 매칭된 결과를 배열로 반환한다.

한정자 g를 설정하면 전체 문자열에서 매칭된 모든 부분이 반환된다.


"1 + 2 = 3".match(/\d+/g); -> ["1","2","3"]


한정자 g를 설정하지 않으면 첫 번째로 매칭된 부분만 반환되는데 역시 반환값은 배열이다. (arr[0]) 이후 arr[n]에는 괄호로 지정한 부분 패턴에 매칭된 부분 문자열 값이 들어간다.


var url = /(\w+):\/\/([\w.]+)\/(\S*)/;

var text = "Visit my blog at http://www.example.com/~david";

var arr = text.match(url); -> [" http://www.example.com/~david","http","www.example.com","~david"]


arr[0]에는 전체 패턴에 의해 매칭된 부분이 있고, arr[1]에는 첫 번째 괄호의 패턴(\w+)으로 부분 매칭도니 문자열이 들어 있다.




split()


인자로 지정한 패턴을 분리자로 삼아 문자열을 배열로 분리하는 일을 한다.

인자가 정규식이 아닌 단순한 문자열이 와도 무방하다.


"123,456,789".split(",") -> ["123","456","789"]

"1, 2, 3, 4".split(/\s*,\s*/) -> ["1","2","3","4"]














참고.


자바스크립트 객체지향 프로그래밍.






댓글