본문 바로가기
프로그래밍 놀이터/Tips

[도서 정리] 6. 위치 찾기 - 손에 잡히는 10분 정규 표현식

by 돼지왕 왕돼지 2019. 12. 28.
반응형

6. 위치 찾기 - 손에 잡히는 10분 정규 표현식



* 경계 지정하기


-

위치 찾기(position matching)는 텍스트 문자열 안에서 반드시 일치해야 하는 위치를 지정할 때 사용한다.


The cat scattered his food all over the room.

여기서 고양이 "cat" 을 정규식으로 사용하면, 원래 찾으려 했던 고양이 cat 과 scattered 의 cat 이 함께 검색된다.


이럴 때 경계(boundaries)를 사용하거나 패턴 앞이나 뒤에 특정한 위치 혹은 경계를 나타내는 메타 문자를 사용하면 원하는 cat 만 추출할 수 있다.





* 단어 경계 지정하기


-

\b 로 표시하는 단어 경계가 있다.

단어 경계라는 이름에서 유추해 볼 수 있듯이, \b 는 단어의 시작이나 마지막을 일치시킬 때 사용한다.


\bcat\b 를 하면 cat 이 단어 형태일 때만 매칭된다.

중요한 것은 완전한 단어 하나를 일치시키고자 한다면, 일치시키고자 하는 단어 앞뒤에 모두 \b 를 붙여야 한다는 점이다.

\bcap 은 cap 으로 시작하는 모든 단어의 일부를 찾는다.

cat\b 는 cap 으로 끝나는 모든 단어의 일부를 찾는다.



-

\b 는 일반적으로 단어의 일부로 사용하는 문자(\w. 영숫자 문자, 밑줄과 일치하는 문자)와 그 외의 문자(\W와 일치하는 문자) 사이에 있는 위치와 일치한다.

( 돼왕 : \w 와 \W 의 경계라는 것은 영문기준으로 보이며, java regex tester 를 통해 테스트해보면 한글도 우리가 원하는 형태로 boundary 를 찾아낸다. )



-

\b는 실제로 문자와 일치하는 것이 아니고, 위치를 가리킨다.

그래서 \bcat\b를 써서 찾은 문자열의 길이는 5가 아니라 3이다.



-

특별히 단어 경계와 일치시키고 싶지 않을 땐, \B를 사용한다.





* 문자열 경계 정의하기


-

단어 경계는 단어의 위치(단어의 시작, 단어의 마지막, 단어 전체 등)를 기반으로 위치를 찾는다.

문자열 경계는 단어 경계와 기능은 비슷하지만, 전체 문자열의 시작이나 마지막 부분과 패턴을 일치시키고자 할 때 사용한다.

문자열 경계는 메타 문자 가운데 캐럿(^)으로 문자열의 사작을, 달러 기호($)로 문자열의 마지막을 나타낸다.



-

캐럿 문자는 대괄호로 둘러싸인 집합 안에서 여는 대괄호 문자 바로 다음에 쓰면 부정을 뜻한다.

집합 밖에서는 패턴 시작 부분에 캐럿문자를 쓰면 문자열의 시작 부분과 일치한다.



** 다중행 모드 사용하기


-

대개 캐럿은 문자열의 시작과 일치하고, 달러 기호는 문자열의 마지막과 일치한다.

예외적으로 두 메타 문자의 동작을 바꾸는 방법이 있다.



-

많은 정규식 구현은 다른 메타 문자의 동작을 변경하는 특수한 메타 문자를 지원하는데, 그 중 하나가 (?m)으로, 다중행(multiline)을 지원한다.

다중행 모드로 변경하면 정규식 엔진이 줄바꿈 문자를 문자열 구분자로 강제로 인식한다.

캐럿은 문자열의 시작이나 줄바꿈 다음(새로운 행)에 나오는 문자열의 시작과 일치하고, 달러 기호는 문자열의 마지막이나 줄바꿈 다음에 나오는 문자열의 마지막과 일치한다.


(?m)은 항상 패턴 제일 앞에 주어야 한다.


(?m)^\s*\/\/.*$

위 정규식은 모든 주석 라인에 주석에 매칭된다.


(?m)은 자바스크립트를 포함한 대부분의 정규 표현식 구현에서는 지원하지 않는다.


(돼왕 : multiline 이 off 되어있을 때 ^ $ 조합은 string 전체대상이고, on 상태일 때 ^ $ 는 line 대상이다. )



-

어떤 정규식 구현은 \A로 문자열의 시작 부분을 지정하고, \Z로 문자열의 마지막을 지정하도록 지원한다.

만약 이 문자들을 지원한다면 이 메타 문자들은 캐럿과 달러 기호와 거의 비슷한 기능을 할 테지만,

캐럿이나 달러 기호와 달리 이들은 (?m)으로 기능을 변경할 수 없으며, 따라서 다중행 모드는 동작하지 않는다.





* 요약


-

정규식은 텍스트의 어떤 구역이나 문자열의 특정 위치에서도 텍스트를 찾을 수 있다. 

\b는 단어 경계를 지정할 때 사용하고(\B는 완전히 반대되는 의미로 사용한다)

캐럿(^)과 달러($)는 문자열 경계(각 문자열의 시작과 끝)을 나타낸다.

(?m) 변경자와 함꼐 사용할 떄 캐럿과 달러 기호는 줄바꿈 문자로 시작하는 문자열이나 줄바꿈 문자로 끝나는 문자열과도 일치한다.




반응형

댓글