[reg] Condition
목차

10. 조건 달기

조건 사용하기?

1. 역참조 조건

2. 전후방탐색 조건

10. 조건 달기

2022년 9월 9일

조건 사용하기?

정규표현식 조건은 물음표(?)를 사용해 정의함
  • 기존에 알고있던 물음표(?)에 대하여...

    • 물음표(?)는 만약 바로 앞에 문자나 표현식이 존재한다면, 그 문자 또는 표현식과 일치함
    • ?= 와 ?<= 가 존재한다면 앞(전방탐색)이나 뒤(후방탐색)의 텍스트와 일치
  • 조건을 다는 물음표(?) 사용

    1. 역참조를 사용하는 조건 처리
    2. 전후방탐색을 사용하는 조건 처리

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