정규 표현식은 문자열에 나타나는 특정 문자 조합과 대응시키기 위해 사용되는 패턴입니다.
mdn 공식 문서의 첫 문장은 정규 표현식을 다음과 같이 정의하고 있습니다. 지난 Section 2 의 HA 를 앞두고 정규 표현식에 대해 간단히 공부하고 블로깅을 한 적이 있었는데요. 오늘은 조금 더 심화시켜서 정규 표현식과 함께 사용이 가능한 메소드 중 일부를 알아볼까 합니다.
공식 문서에서 위의 인용한 부분 다음을 살펴보면 이렇게 되어있습니다.
자바스크립트에서 정규 표현식 또한 객체입니다. 이 패턴들은 RegExp의 exec 메소드와 test 메소드, 그리고 String의 match 메소드, replace 메소드, search 메소드, split 메소드와 함께 쓰입니다.
메소드의 기능을 간단히 요약하면 다음과 같습니다.
exec()
: 주어진 문자열에서 정규식과 일치하는 문자열을 검색하고, 결과를 담은 배열을 리턴합니다. 만약 일치하는 결과가 없다면 null 을 리턴합니다.
test()
: 정규식과 일치하는 문자열이 있는지 여부를 검색하고, boolean 값을 리턴합니다.
match()
: 문자열과 정규식이 매치되는 부분을 검색하고, 일치하는 전체 문자열을 첫 번째 요소로 포함하는 배열을 리턴합니다. 일치하는 결과가 없다면 null 을 리턴합니다.
replace()
: 문자열에서 정규식과 일치하는 부분을 찾고, 이를 다른 문자열로 치환합니다.
search()
: 문자열에서 정규식과 일치하는 것을 찾아 그 인덱스를 반환합니다.
split()
: 기본적으로 split 은 문자열을 주어진 구분자(separator) 로 쪼개어 배열화합니다. 구분자 자리에 정규식이 들어간다면 정규식이 구분자를 대체하게 됩니다. 이 때 특이사항으로 만약 separator 가 () 를 포함하는 정규식일 경우에는, 구분자를 포함한 배열을 리턴합니다.
String 메소드들은 꼭 정규식하고만 사용해야하는 하는 것은 아닙니다.
위에서 split()
메소드의 경우 특이사항이 있다는 점을 언급했는데요. 이를 조금만 더 풀어보도록 하겠습니다. mdn 공식문서에서는 예제의 후반부에서 언급하고 있는 내용입니다.
let str = "Hello World, I'm KimEenSung!"
str.split(' '); // ["Hello", "World," "I'm", "KimEenSung!"]
위의 예제에서 split()
메소드는 공백을 기준으로 주어진 문자열을 쪼개고 있습니다. 이 때 공백 문자는 리턴되는 배열에는 포함되지 않죠. 공백이 아닌 정규식을 넣어보면 어떨까요? 위의 문장에서 총 2 번 등장하고 있는 'o' 라는 알파벳을 정규식으로 검색해 split()
해보도록 하겠습니다.
let str = "Hello World, I'm KimEenSung!"
str.split(/o/); // ["Hell", " W", "rld, I'm KimEenSung!"]
알파벳 'o' 를 기준으로 주어진 문자열을 자르고 있습니다. 이때 'o' 는 구분자이기 때문에 리턴되는 배열에 포함되지 않죠. 'o' 를 제외한 나머지 문자들이 배열화되어 리턴되는 것을 확인할 수 있습니다.
만약 위의 정규식에서 /o/
의 가운데에 괄호를 씌워 /(o)/
어떻게 될까요? 이렇게 해놓으니 무슨 이모티콘 같기도 한데요. 정규 표현식에서 괄호는 어떤 것을 그룹화(Grouping)하거나 캡쳐(Capturing) 하는 의미가 있습니다. 이 부분은 추후에 기회가 되면 자세히 다루도록 하구요. 중요한 것은 괄호를 씌웠을 때 split()
메소드가 어떻게 반응하는가 하는 부분입니다.
let str = "Hello World, I'm KimEenSung!"
str.split(/(o)/); // ["Hell", "o", " W", "o", "rld, I'm KimEenSung!"]
보시면 기존의 /o/
라는 정규식으로 잘랐을 때와 달리 구분자인 'o' 가 포함된 배열을 반환하는 것을 확인할 수 있습니다. 이 점이 괄호를 적용한 정규식이 split()
메소드와 사용될 경우 생기는 특이사항이라고 할 수 있습니다.