가독성 좋게 정규식 설계하기

2025. 7. 22. 12:57·Programing Langauge/swift
반응형

👋 들어가기 전

즐겨보는 유튜버 이도원님 영상 중 개네마리 1주년 영상이 있다.

1주년 영상 답게 영상 시간도 길고, 재밌는 부분을 많은 타임링크 형태로 남겨준다.

 

개발자면, 해당 타임링크는 일정 정규식으로 충분히 잡을 수 있다.

 

하지만 정규식 작성이 항상 어려웠던 이유는 바로 가독성이 너무 떨어진다는 점..

 

하지만 이번에 좋은 방법을 찾았다.

 

그 방법을 남겨보려고한다.


🏁 학습할 내용

  • 타임링크 조건  
  • verbose 모드 적용
    •  verbose란
    • 정규식에서 verbose
    • 적용 후
    • 결과
  • 자주 쓸만한 정규식 패턴 모음

⏰ 타임링크 조건

  • xxxx:xx:xx 형식
    • 시간은 최대 4자리 (그 전에 숫자들 있으면 안됨)
    • 분은 0 ~ 59분까지, 한 자릿수일 때 앞에 0은 optional
    • 초 역시 분과 같음, 0 ~59초, 한자릿수일 때 앞에 0은 optional  이후 숫자들 있으면 안됨 (ex xxxx:xx:123)일때 ,
  • xx:xx 형식
    • `시`가 없음
    • 분과 초 모두 xxxx:xx:xx 형식과 같음
    • 초 뒤에 숫자들 있으면 안됨 

swift로 작성하면 다음과 같다.

 

let pattern = #"(?<!\d)(\d{1,4}:(0?[0-9]|[1-5][0-9]):(0?[0-9]|[1-5][0-9])|(0?[0-9]|[1-5][0-9]):(0?[0-9]|[1-5][0-9]))(?!\d)"#

 

동작은 정확하지만, 한줄에 다 보이지도 않고 어지럽다..

 

한번 개선해보자.


✅ Verbose란

Verbose는 보통 함수나 명령어를 실행할 때, 상세한 정보를 출력하도록 설정하는 옵션이다.

 

📝 정규식에서 Verbose

정규식에서 verbose 스타일은 주석과 줄바꿈을 무시하게 만들어준다.

♻️ 적용 후

swift에서는 패턴안에서는 따로 지원하지 않지만, option을 이용해 사용할 수 있다.

  • allowCommentsAndWhitespace: 주석 + 줄바꿈 무시
  • caseInsensitive: 대소문자 구분 X
  • Raw String Literal (#""#)로 변경해, \를 한번으로도 인식, (원래는 \\로 써야함) 
let pattern = #"""
    (?<!\d)                     # not preceded by a digit

    (
        \d{1,4} :               # 1~4자리 시간
        (0?[0-9]|[1-5][0-9]) : # 분 (0~59)
        (0?[0-9]|[1-5][0-9])   # 초 (0~59)
      |
        (0?[0-9]|[1-5][0-9]) : # 분 (0~59)
        (0?[0-9]|[1-5][0-9])   # 초 (0~59)
    )

    (?!\d)                     # not followed by a digit
    """#
    
    
guard let regex = try? NSRegularExpression(
	pattern: pattern,
    options: [.allowCommentsAndWhitespace, .caseInsensitive]
    ) else {
      print("❌ pattern is wrong")
      return false
}

🚀 결과


⭐️ 자주쓰는 정규식 모음

📧 이메일

 private let pattern = #"""

  ^                           # 문자열 시작
  [A-Z0-9._%+-]+              # 영문/숫자/기호 허용
  @                           # @문자
  (?:[A-Z0-9-]+\.)+           # 하나 이상의 도메인 (sub.domain.)
  [A-Z]{2,}                   # 최상위도메인(TLD) 최소 2글자 
  $                           # 문자열 끝

  """#

⏰ 타임링크

  private let pattern = #"""
    (?<!\d)                     # not preceded by a digit

    (
        \d{1,4} :               # 1~4자리 시간
        (0?[0-9]|[1-5][0-9]) : # 분 (0~59)
        (0?[0-9]|[1-5][0-9])   # 초 (0~59)
      |
        (0?[0-9]|[1-5][0-9]) : # 분 (0~59)
        (0?[0-9]|[1-5][0-9])   # 초 (0~59)
    )

    (?!\d)                     # not followed by a digit
    """#

출처

https://wikidocs.net/4308

 

08-2 정규 표현식 시작하기

정규 표현식에서는 메타 문자(meta characters)를 사용한다. 먼저 메타 문자가 무엇인지 알아보자. [TOC] ## 정규 표현식의 기초, 메타 문자 메타 문자란 원…

wikidocs.net

 

반응형

'Programing Langauge > swift' 카테고리의 다른 글

@retroactive  (0) 2025.08.23
@dynamicMemberLookup  (3) 2025.07.24
매크로  (0) 2025.06.28
Mirror  (0) 2025.03.19
@inlinable  (0) 2025.03.18
'Programing Langauge/swift' 카테고리의 다른 글
  • @retroactive
  • @dynamicMemberLookup
  • 매크로
  • Mirror
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (325) N
      • CS (30)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (6)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (41)
        • swift (34)
        • python (6)
        • Kotlin (1)
      • iOS (133) N
        • UIKit (37)
        • Combine (1)
        • SwiftUI (33) N
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (11)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (20)
        • 어노테이션 (6)
        • 튜토리얼 (13)
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
      • AI (9)
        • 이론 (9)
        • MCP (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    concurrency
    lifecycle
    투포인터
    dispatch
    SwiftUI
    dfs
    AVFoundation
    dp
    백준
    IOS
    Spring
    protocol
    Tuist
    Swift
    GIT
    CS
    boostcamp
    UIKit
    property
    프로그래머스
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
가독성 좋게 정규식 설계하기
상단으로

티스토리툴바