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 표현식(앞에서 봤던 ‘| 표현식’과 동일한 구문을 사용하여)으로도 사용할 수 있다.
-
더 간단한 방법으로 비슷한 결과를 얻을 수 있으므로 전후방탐색 조건은 자주 사용하지 않는다.
* 요약
-
조건을 충족하는지 아닌지에 따라 표현식을 수행하도록 정규 표현식 패턴에 조건을 달 수 있다.
조건은 역참조(역참조가 가리키는 하위 표현식의 존재를 확인한다)나 전후탐색으로 설정할 수 있다.
'프로그래밍 놀이터 > Tips' 카테고리의 다른 글
[도서 정리] 부록A. 많이 쓰는 앱과 언어에서 활용하는 정규식 - 손에 잡히는 10분 정규 표현식 (0) | 2020.01.03 |
---|---|
[도서 정리] 11. 정규 표현식으로 해결하는 일반적인 문제들 - 손에 잡히는 10분 정규 표현식 (0) | 2020.01.02 |
[도서 정리] 9. 전방탐색과 후방탐색 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.31 |
[도서 정리] 8. 역참조 사용하기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.30 |
[도서 정리] 7. 하위 표현식 사용하기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.29 |
댓글