Sure, Why not?

특수문자 체크 본문

💻

특수문자 체크

joho2022 2025. 4. 3. 16:44

ㄱ+한자, ㅁ+한자로 특수문자 경험있다 손 ✋

 

 

 

- 이미 내장된 API인 CharacterSet을 이용하거나

- 정규식 사용하여서

 

문자열에 특수문자가 있는지 체크를 할 수 있을 것이다.

 

 


CharacterSet을 이용한 검사

 

 

Template:General Category (Unicode) - Wikipedia

From Wikipedia, the free encyclopedia General Category (Unicode Character Property)[a] Value Category Major, minor Basic type[b] Character assigned[b] Count[c](as of 16.0) Remarks   L, Letter; LC, Cased Letter (Lu, Ll, and Lt only)[d] Lu Letter, uppercase

en.wikipedia.org

 

 

CharacterSet | Apple Developer Documentation

A set of Unicode character values for use in search operations.

developer.apple.com

 

 

CharacterSet은 유니코드의 General Category 값을 기반으로 문자들을 분류해서 관리한다.

 

General Category는 유니코드에서 문자를 유형별로 분류하여 관리하는 범주로, 각 문자에 대해 그 특성을 정의한다

 

 


 

 

 

CharacterSet’s and How to Use Them in Swift?

How to User CharacterSet’s With Effective Extensions including Real Life Samples

kocyigityunus.medium.com

 

 

각 문자 집합이 어떤 문자들을 포함하고 있는지 직접 눈으로 확인하고 싶다면,

해당 레퍼런스를 참고해서,

 

다음과 같은 코드로 확인해볼 수 있다.

import Foundation

extension CharacterSet {
    func getCharacters() -> [String] {
        let characterSet = self as NSCharacterSet
        var characters: [String] = []
        for plane:UInt8 in 0..<17 {
            if characterSet.hasMemberInPlane(plane) {
                let planeStart = UInt32(plane) << 16
                let nextPlaneStart = (UInt32(plane) + 1) << 16
                for char: UTF32Char in planeStart..<nextPlaneStart {
                    if characterSet.longCharacterIsMember(char) {
                        if let unicodeCharacter = UnicodeScalar(char) {
                            characters.append(String(unicodeCharacter))
                        }
                    }
                }
            }
        }
        return characters
    }
}

let characters = CharacterSet.punctuationCharacters.getCharacters()
print(characters.joined(separator: ","))

 

 

그래서 

여러 문자들이 있지만 주의깊게 볼 것들이

symbols punctuationCharacters가 있다.

 

symbols가 다 커버 해줄 것이라고 생각했지만,

! ? . , 와 같은 문자들이 빠져있었다.

이유는 유니코드에서 symbolspunctuationCharacters 구두점(! ? . , ) 서로 다른 범주로 구분하기 때문이다.

 

그래서 특수문자를 웬만한 것들을 체크할려면 같이 활용해야

검사를 원활하게 할 수 있다.

 

 

 

코드예시

func containsSpecialCharacter(_ text: String) -> Bool {
    let specialCharacterSet = CharacterSet.symbols
        .union(.punctuationCharacters)

    return text.rangeOfCharacter(from: specialCharacterSet) != nil
}

print(containsSpecialCharacter("안녕!")) // true
print(containsSpecialCharacter("하이")) // false
print(containsSpecialCharacter("하이*")) // true

 

 


 

정규식을 이용해서 특수문자 검사

코드예시

func containsSpecialCharacter(_ text: String) -> Bool {
    let pattern = "[^A-Za-z0-9가-힣ㄱ-ㅎㅏ-ㅣ]"
    return text.range(of: pattern, options: .regularExpression) != nil
}

print(containsSpecialCharacter("안녕😈")) // true
print(containsSpecialCharacter("하이")) // false
print(containsSpecialCharacter("하이*")) // true

 

정규식 사용할 때 NSRegularExpression 도 있지만,

옛날거고, 코드가 길고 좀 복잡하다

 

String자체에서 정규식 검사를 할 수 있기 때문에,

위와 같은 코드로 확인할 수 있다.

 

정규식을 해석하자면,

[^문자] -> 대괄호 안에 있는 문자들을 제외한 나머지를 찾는다는 뜻

A-Z -> 대문자 영어 알파벳

a-z -> 소문자 영어 알파벳

0-9 -> 0~9숫자

가-힣 -> 모든 완성된 한글 범위

ㄱ-ㅎㅏ-ㅣ -> 자음 모음 범위

 

종합하면,

영어 대소문자, 숫자, 한글이 아닌 모든 문자를 찾는다는 뜻이다.

 


 

 

특수문자를 체크하는 두 가지 방법을 살펴봤다.

 

특수문자는 종류가 워낙 광범위하기 때문에 기존에 제공되는 API도 있지만,

 

전부 나열해서 찾는 것보다

허용할 문자를 기준으로 필터링하는 방식이 더 직관적인 것 같다.

 

그래서 앞으로 나는 정규식을 사용해 특수문자를 필터링할 것 같다.

'💻' 카테고리의 다른 글

PNG SVG JPEG HEIC WebP  (1) 2025.04.26
.pbxproj 충돌  (0) 2025.04.15
SwiftUI) Custom TextField Placeholder  (2) 2025.04.01
Naver 로그인  (0) 2025.03.22
Google 로그인  (0) 2025.03.21