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

[도서 정리] 11. 정규 표현식으로 해결하는 일반적인 문제들 - 손에 잡히는 10분 정규 표현식

by 돼지왕 왕돼지 2020. 1. 2.
반응형


11. 정규 표현식으로 해결하는 일반적인 문제들 - 손에 잡히는 10분 정규 표현식


-

여기서 제시한 예제들이 현존하는 문제 상황에 대한 궁극적인 해결책은 아니다.

궁극적인 해결책 자체가 거의 존재하지 않는다는 점은 분명하다.

예측하지 못하는 상황을 얼마나 허용할 것인지에 따라 해결책이 여러 개인 경우가 훨씬 많고 패턴의 성능과, 주어진 상황에서 얼마나 많은 조건을 다룰지 설정하는 패턴의 범위 사이에는 항상 교환 조건(trade-off)가 존재한다.





* 북미 전화번호



* 미국 우편번호



* 캐나다 우편번호



* 영국 우편번호



* 미국 사회보장번호



* IP 주소



* URL


-

https?:\/\/[-\w.]+(:\d+)?(\/([\w\/_.]*)?)?


이 정규식은 대소문자를 구별해서는 안 된다.





* 완전한 URL


-

https?:\/\/(\w*:\w*@)?[-\w.]+(:\d+)?(\/([\w\/_.]*(\?\S+)?)?)?


이 정규식은 http://id:password@www.naver.com/ 과 같은 url 도 커버한다.


이 정규식은 대소문자를 구별해서는 안 된다.

이 정규식은 일반 URL 보다 복잡한 패턴이라 더 느리게 실행된다.

내장된 사용자 이름과 암호나 쿼리 문자열 같은 기능이 더 필요하지 않다면 사용하지 않는 편이 좋다.





* 이메일 주소


-

(\w+\.)*\w+@(\w+\.)+[A-Za-z]+


이메일 주소를 찾는 정규 표현식은 대체로 대소문자를 구별해서는 안 된다.





* HTML 주석


-

<!-{2,}.*?-{2,}>





* 자바스크립트 주석


-

\/\/.*





* 신용카드 번호



* 주민등록번호



* 미국식 날짜 형식을 국제표준(ISO 8601) 날짜 형식으로 바꾸기



* 함수 이름 바꾸기



* 정규식과 한글과 유니코드


** 한글 일치시키기


-

정규식에서 한글을 사용하려면 어떻게 해야 할까?

동일하게 사용하면 된다.

단, 한 가지 조심할 점이 있는데, \w 는 한글과 일치하지 않는다.

\w 는 [A-Za-z0-9]와 일치한다.

\b 는 영단어의 경계만 나타낸다.

\b 가 일치하는 부분은 \w 와 \W 사이이다.


돼왕 : 테스트해보면 \b 도 한글 boundary 로도 작동한다.



-

[수우미양가] 가 아닌 [수|우|미|양|가] 로 해야 한다.

많은 정규식 구현에서 [수우미양가]와 같은 정규식 형태를 지원하지 못한다.

문자 집합을 나타내는 메타 문자( [ ] )는 집합에 속한 문자 중 하나와 일치하는데, 한글처럼 두 바이트 이상으로 이루어진 문자는 제대로 인식하지 못하는 경우가 많다.



-

국어:수

영어:수

수학:수

미술:양

체육:가


점수만 뽑아내기 위해서는..

(?<=[^가-힣])(수|우|미|양|가)(?=[^가-힣])


유니코드에서 ‘가’는 한글 문자 집합에서 가장 첫 번째 문자고, ‘힣’는 가장 마지막 문자다.

그리고 하이픈은(-)은 문자의 범위를 나타내므로, [가-힣] 패턴은 [A-Z] 패턴과 마찬가지로 ‘가’ 문자부터 ‘힣’ 문자 사이에 있는 모든 문자를 나타낸다.


돼왕 : 자음 모음까지 포함하려면 ㄱ-ㅎㅏ-ㅣ가-힣 (참조)


이 예제는 유니코드 환경에서만 제대로 동작한다.

따라서 euc-kr 등으로 인코딩된 텍스트일 경우는 일치하지 않으며, 루비 1.8버전 같이 정규식에서 유니코드를 지원하지 않는 구현에서도 제대로 동작하지 않는다.



** 유니코드 일치시키기.


-

유니코드에는 한글뿐만 아니라 다양한 언어와 기호가 포함되어 있다.

저작권 표시(copyright mark)와 같이 키보드로 입력하기 어려운 기호를 정규식으로 일치시키려면 어떻게 해야 할까?

다양한 방법이 존재하지만, 그중에서 유니코드 번호(Unicode code point)를 사용하는 방법이 있다.


\u00a9 와 같이 말이다.


이 형태는 자바, 자바스크립트, 닷넷, 파이썬에서 지원하며 펄, PCRE, 루비(1.9이상)에서는 \u{00a9} 같은 형식으로 표현한다.



-

유니코드 번호 외에도 유니코드 블록(Unicode block), 유니코드 스크립트(Unicode script)등을 사용해 일치시키는 방법도 있지만, 많은 정규 표현식 구현에서 지원하지 않는다.





* 요약




반응형

댓글