awesomeyelim 2022. 9. 6. 22:48
728x90

쑰건 μ‚¬μš©ν•˜κΈ°?

μ •κ·œν‘œν˜„μ‹ 쑰건은 λ¬ΌμŒν‘œ(?)λ₯Ό μ‚¬μš©ν•΄ μ •μ˜ν•¨
  • 기쑴에 μ•Œκ³ μžˆλ˜ λ¬ΌμŒν‘œ(?)에 λŒ€ν•˜μ—¬...
    • λ¬ΌμŒν‘œ(?)λŠ” λ§Œμ•½ λ°”λ‘œ μ•žμ— λ¬Έμžλ‚˜ ν‘œν˜„μ‹μ΄ μ‘΄μž¬ν•œλ‹€λ©΄, κ·Έ 문자 λ˜λŠ” ν‘œν˜„μ‹κ³Ό μΌμΉ˜ν•¨
    • ?= 와 ?<= κ°€ μ‘΄μž¬ν•œλ‹€λ©΄ μ•ž(전방탐색)μ΄λ‚˜ λ’€(후방탐색)의 ν…μŠ€νŠΈμ™€ 일치

 

  • 쑰건을 λ‹€λŠ” λ¬ΌμŒν‘œ(?) μ‚¬μš©
    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