Programing Langauge/swift

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

Hamp 2025. 7. 22. 12:57
반응형

👋 들어가기 전

즐겨보는 유튜버 이도원님 영상 중 개네마리 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

 

반응형