![[reg] Condition](/_next/image?url=%2Fimages%2Fempty.png&w=2048&q=75)
0
목차
10. 조건 달기
조건 사용하기?
1. 역참조 조건
2. 전후방탐색 조건
10. 조건 달기
2022년 9월 9일조건 사용하기?
정규표현식 조건은 물음표(?)를 사용해 정의함
-
기존에 알고있던 물음표(?)에 대하여...
- 물음표(?)는 만약 바로 앞에 문자나 표현식이 존재한다면, 그 문자 또는 표현식과 일치함
- ?= 와 ?<= 가 존재한다면 앞(전방탐색)이나 뒤(후방탐색)의 텍스트와 일치
-
조건을 다는 물음표(?) 사용
- 역참조를 사용하는 조건 처리
- 전후방탐색을 사용하는 조건 처리
1. 역참조 조건
역참조 조건은 이전 하위 표현식이 검색에 성공했을 경우에만 다시 그 표현식을 검사함
- 조건(if)을 표현하는 구문은 다음과 같음
(?(backreference)true)
물음표(?)로 조건을 시작 -> 괄호안에 역참조를 지정 -> 역참조가 존재하는 경우에만 평가될 표현식이 바로 뒤에 나옴
예시비교
- 예시
<A HREF="/home"><IMG SRC="/images/home.gif"></A>
| 대입식 | 결과 |
(<[Aa]\s+[^>]+>\s*)?<[Ii][Mm][Gg]\s+[^>]+>(?(1)\s*</[Aa]) | <A HREF="/home"><IMG SRC="/images/home.gif"></A> |
📌 (<[Aa]\s+[^>]+>\s*)?에서는 <A> 나 <a> 시작태그가 일치함(속성이 있다면, 속성도 함께 일치함)
📌 <[Ii][Mm][Gg]\s+[^>]+>는 <IMG>태그에 속한 속성도 모두 포함해 일치시킴
📌 (?(1)\s*</[Aa]) 는 조건으로 시작하는데 ?(1)은 역참조1 (<A>시작태그)이 있을때만 수행하라는 뜻임(태그<A>가 일치한다면 뒤에있는 종료태그도 일치시키라는 소리)
🔑 역참조 ?(1)을 이스케이프 할필요는 없다. ?(\1) x
- 조건을 만족하는지 아닌지(if~else) 판단하는 표현식은 다음과 같음(역참조가 존재하지 않을 경우에만 수행되는 표현식)
(?(backreference)true|false)
예시비교
- 예시
123-456-7890
(123)456-7890
(123)-456-7890
| 대입식 | |
(\()?\d{3}(?(1)\)|-)\d{3}-\d{4} | |
| 결과 | |
| 123-456-7890 | |
| (123)456-7890 | |
| (123)-456-7890 |
📌 (\()?는 여는 괄호가 있는지 검사하지만, 이번에는 괄호로 감싸 그 결과를 하위표현식으로 만듬
📌 \d{3}는 숫자 세개와 일치
📌 (?(1)\)|-)는 조건을 만족하는지에 따라 닫는괄호()) 혹은 하이픈(-)과 일치함 -> 이런식으로 괄호가 항상 짝을 이룰수 있다.
🔑 조건을 달면 패턴이 매우 복잡해짐 -> 표현식을 작은 조각으로 나누고 합치는 방법 추천
2. 전후방탐색 조건
전후방탐색 조건은 전방탐색과 후방탐색 명령이 성공했는지에 따라 표현식을 수행할지 결정함
📌 문법이 역참조(괄호안에 넣는 숫자)가 전후방 탐색 표현식으로 대체되었다는 점만 빼고 역참조 조건과 동일함
예시비교
- 예시
11111
33333-
44444-4444
| 대입식 | |
\d{5}(?(?=-)-\d{4}) | |
| 결과 | |
| 11111 | |
| 33333- | |
| 44444-4444 |
📌 \d{5} 는 앞부분 다섯자리 숫자와 일치
📌 (?(?=-)-\d{4})같은 형태를 한 조건이 나타냄
📌 전방탐색 ?=-로 하이픈을 찾아내지만 소비하지 않음
📌 하이픈이 있다는 조건을 만족한다면? -\d{4} 하이픈과 이어나오는 숫자 네개와 일치함
🌟 전방탐색과 후방탐색(긍정형과 부정형)은 조건으로 사용할 수있고 else 표현식(앞에서 봤던 '| 표현식'과 동일한 구문을 사용하여)으로도 사용할 수있다.
🔑 더 간단한 방법으로 비슷한 결과를 얻을수 있기에 전후방탐색 조건은 자주사용하지 x