| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- SwiftUI
- 함께자라기
- 팀 개발을 위한 git
- nidthirdpartylogin
- webp
- Firestore
- 클린 아키텍처
- fetchdescriptor
- TestFlight
- xcode 엔터 표시
- 코드스쿼드
- xcode 공백 표시
- Cocoa Pod
- NSTextStorage
- Tuist
- contentalignmentpoint
- JPEG
- spm 에러
- github 시작하기
- JPG
- 캐러셀
- swift 모듈화
- heic
- 테스트 타겟
- .pbxproj
- png
- 타뷸레이션
- 무한스크롤
- swiftdata
- NSTextStorageDelegate
- Today
- Total
Sure, Why not?
특수문자 체크 본문

- 이미 내장된 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가 다 커버 해줄 것이라고 생각했지만,
! ? . , 와 같은 문자들이 빠져있었다.
이유는 유니코드에서 symbols와 punctuationCharacters 구두점(! ? . , )는 서로 다른 범주로 구분하기 때문이다.
그래서 특수문자를 웬만한 것들을 체크할려면 같이 활용해야
검사를 원활하게 할 수 있다.
코드예시
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 |