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

[도서 정리] 10. 조건 달기 - 손에 잡히는 10분 정규 표현식

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

10. 조건 달기 - 손에 잡히는 10분 정규 표현식



* 왜 조건을 다는가?


-

모든 정규식 구현에서 조건 처리를 지원하지는 않는다.





* 조건 사용하기


-

조건을 다는 구문 또한 물음표(?)를 사용하는데, 역참조를 사용하는 조건 처리와 전후방탐색을 사용하는 조건 처리에도 사용할 수 있다.



** 역참조 조건


-

역참조 조건은 이전 하위 표현식이 검색에 성공했을 경우에만 다시 그 표현식을 검사한다.


<div>

<a href=“/home”><img src=“/images/home.gif”></a>

<img src=“/images/spacer.gif”>

<a href=“/search”><img src=“/images/search.gif”></a>

</div>


여기서 <img> 태그를 모두 찾고, <a> 로 감싸져 있을 때는 이 링크 태그까지 일치시킨다.


(<[Aa]\s+[^>]+>\s*)?<[Ii][Mm][Gg]\s+[^>]+>(?(1)\s*<\/[Aa]>)


?(1) 은 역참조1 (<A> 시작 태그)이 있을 때만 수행하라는 말이다.

다른 말로, 태그 <A> 와 일치한다면 그 뒤의 종료 태그도 일치시키라는 의미이다.



-

?(1) 은 역참조 1이 있는지 없는지 검사한다.

역참조 번호(예제에서는 1)를 조건에서 이스케이프 할 필요는 없다.

즉 ?(1) 이 맞고, ?(\1)은 잘못된 것이다.

그렇지만 후자도 동작한다.



-

조건은 else 표현식을 써서 나타낼 수도 있는데, else 표현식은 역참조가 존재하지 않을 경우에만 수행되는 표현식을 말한다.

이 조건을 나타내는 문법은 다음과 같다.


(?(backreference)true|false)


돼왕 : 참고로 자바는 이 문법을 지원하지 않는다.



-

조건을 달면 패턴이 매우 복잡해 보일 수 있고, 그렇기 때문에 문제가 발생했을 때 찾아 해결하기도 힘들다.

그래서 표현식을 작은 조각으로 나누고 그 조각들을 시험해 본 다음에 합치는 방법을 사용하는 편이 좋다.



** 전후방탐색 조건


-

전후방탐색 조건은 전방탐색과 후방탐색 명령이 성공했는지에 따라 표현식을 수행할지 결정한다.

전후방탐색 조건 문법은 역참조(괄호 안에 넣는 숫자)가 완전히 전후방탐색 표현식으로 대체되었다는 점만 빼고는 역참조 조건과 동일하다.



-

미국 우편번호는 5자리 숫자 또는 5자리숫자-4자리 숫자로 구성되어 있다.

11111

22222

33333-

44444-4444


\d{5}(?(?=-)-\d{4})


돼왕 : 이 역시 java 에서는 지원하지 않는다.



-

전방탐색과 후방탐색(긍정형과 부정형)은 조건으로 사용할 수도 있고, else 표현식(앞에서 봤던 ‘| 표현식’과 동일한 구문을 사용하여)으로도 사용할 수 있다.



-

더 간단한 방법으로 비슷한 결과를 얻을 수 있으므로 전후방탐색 조건은 자주 사용하지 않는다.





* 요약


-

조건을 충족하는지 아닌지에 따라 표현식을 수행하도록 정규 표현식 패턴에 조건을 달 수 있다.

조건은 역참조(역참조가 가리키는 하위 표현식의 존재를 확인한다)나 전후탐색으로 설정할 수 있다.




반응형

댓글