[Swift] 정규표현식으로 문자열 대치하는 방법

레일리·2024년 6월 14일
0
post-thumbnail
post-custom-banner

Swift를 사용하면 보통 아래와 같이 replacingOccurrences(of:with:) 를 사용하여 문자열을 대치합니다.
of : 바꿀 문자열입니다.
with : 대상을 대체할 문자열입니다.

import Foundation
var s = "abcd..ef."
print(s.replacingOccurrences(of: ".", with: ""))
// 출력 : abcdef

하지만 문자열 대치가 조금 복잡한 경우도 있습니다. 예를들면 다음과 같습니다.

var s = ".!@BaT#*..y.abcdefghijklm."

조건1 : 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.

방법 1. hasPrefix, hasSuffix

hasPrefix : String(문자열)이 지정된 접두사로 시작하는지 여부를 Boolean 값으로 반환합니다.
hasSuffix : String(문자열)이 지정된 접미사로 끝나는지 여부를 Boolean 값으로 반환합니다.

var s = ".!@BaT#*..y.abcdefghijklm."

if s.hasPrefix(".") { s.removeFirst() }
if s.hasSuffix(".") { s.removeLast() }

print(s)
// 출력 : !@BaT#*..y.abcdefghijklm

정규표현식과 관련 없지만 간단하게 문제를 해결할 수 있습니다.

방법 2. 정규표현식

import Foundation

var s = ".!@BaT#*..y.abcdefghijklm."

do {
    let patter = "^\\.|\\.$"
    let regex = try NSRegularExpression(pattern: patter)
    let range = NSRange(s.startIndex..<s.endIndex, in: s)
    s = regex.stringByReplacingMatches(in: s, range: range, withTemplate: "")
} catch {
    print("정규표현식 오류 : \(error)")
}

print(s)
// 출력 : !@BaT#*..y.abcdefghijklm

NSRegularExpression 를 사용하면 원하는 패턴의 정규표현식을 적용할 수 있지만 코드가 조금 길어집니다.

방법 3. replacingOccurrences와 정규표현식

import Foundation

var s = ".!@BaT#*..y.abcdefghijklm."
print(s.replacingOccurrences(of: "^\\.|\\.$", with: "", options: .regularExpression))
// 출력 : !@BaT#*..y.abcdefghijklm

replacingOccurrencesoptions 파라미터에 regularExpression 를 지정하면 of 파라미터에 정규표현식을 적용할 수 있습니다. 방법 2에 비해 훨씬 간결해 졌습니다.

조건2 : 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.

방법 1. 정규표현식

import Foundation

var s = ".!@BaT#*..y.abcdefghijklm."

do {
   let patter = "[^a-z0-9\\-\\_\\.]"
   let regex = try NSRegularExpression(pattern: patter)
   let range = NSRange(s.startIndex..<s.endIndex, in: s)
    s = regex.stringByReplacingMatches(in: s, range: range, withTemplate: "")
} catch {
   print("정규표현식 오류 : \(error)")
}

print(s)
// 출력 : .a..y.abcdefghijklm.

방법 2. replacingOccurrences와 정규표현식

import Foundation

var s = ".!@BaT#*..y.abcdefghijklm."
print(s.replacingOccurrences(of: "[^a-z0-9\\-\\_\\.]", with: "", options: .regularExpression))
// 출력 : .a..y.abcdefghijklm.

조건 1과 마찬가지로 replacingOccurrences 와 정규표현식을 함께 사용하면 간결합니다.

정규식 치트 시트

profile
나야, 개발자
post-custom-banner

0개의 댓글