ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10. 쑰건 달기
    🧠 codingtest/μ •κ·œν‘œν˜„μ‹(regexp) 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

     

    λŒ“κΈ€