문자열에서 숫자가 아닌 문자를 모두 빨리 제거
알 수 없는 데이터를 구문 분석해야 하는데, 이 데이터는 숫자 값이어야 하지만 공백이나 기타 영숫자가 아닌 문자가 포함되어 있을 수 있습니다.
스위프트에서 새로운 방법이 있습니까?내가 온라인에서 찾을 수 있는 것은 낡은 C 방식뿐인 것 같습니다.
나는 보고있습니다.stringByTrimmingCharactersInSet
- 제 입력에는 문자열의 시작 또는 끝에 공백/특수 문자만 있을 것으로 확신합니다.이것에 사용할 수 있는 내장 캐릭터 세트가 있습니까?아니면 나만의 것을 만들어야 합니까?
우리가 다른 사람들을 도와줄 수 있는stringFromCharactersInSet()
그래서 내가 보관할 유효한 문자들만 지정할 수 있을 것입니다.
'StringFromCharacters' 같은 것이 있으면 좋겠다고 생각했습니다.보관할 유효한 문자만 지정할 수 있는 InSet().
사용하실 수 있습니다.trimmingCharacters
와 함께inverted
문자열의 시작 또는 끝에서 문자를 제거하는 문자 집합입니다.Swift 3 이후 버전:
let result = string.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)
또는 문자열의 어디에서나 숫자가 아닌 문자를 제거하려면 다음을 수행할 수 있습니다.filter
그characters
, 예를 들어 Swift 4.2.1의 경우:
let result = string.filter("0123456789.".contains)
또는 문자열의 모든 위치에서 문자 집합에서 문자를 제거하려면 다음을 사용합니다.
let result = String(string.unicodeScalars.filter(CharacterSet.whitespaces.inverted.contains))
또는 특정 형식의 유효한 문자열만 일치시키려면(예:####.##
), 정규식을 사용할 수 있습니다.예를 들어,
if let range = string.range(of: #"\d+(\.\d*)?"#, options: .regularExpression) {
let result = string[range] // or `String(string[range])` if you need `String`
}
이처럼 서로 다른 접근 방식의 동작은 조금씩 다르기 때문에 정확히 무엇을 하려고 하는지에 따라 달라집니다.소수점을 포함하거나 제외합니다. 또는 정수만 원하는 경우.이를 달성하기 위한 많은 방법들이 있습니다.
이전의 스위프트 2 구문에 대해서는 이 답변의 이전 개정판을 참조하십시오.
let result = string.stringByReplacingOccurrencesOfString("[^0-9]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil).stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
스위프트 3
let result = string.replacingOccurrences( of:"[^0-9]", with: "", options: .regularExpression)
저는 이 솔루션을 선호합니다. 왜냐하면 저는 확장을 좋아하기 때문이고, 제가 보기에는 좀 더 깨끗해 보이기 때문입니다.여기서 재현되는 솔루션:
extension String {
var digits: String {
return components(separatedBy: CharacterSet.decimalDigits.inverted)
.joined()
}
}
범위에 대한 패턴 일치 연산자를 사용하여 문자열의 UnicodeScalarView를 필터링하고 0에서 9 사이의 UnicodeScalar ClosedRange를 통과한 다음 결과로 나타나는 UnicodeScalarView로 새 문자열을 초기화할 수 있습니다.
extension String {
private static var digits = UnicodeScalar("0")..."9"
var digits: String {
return String(unicodeScalars.filter(String.digits.contains))
}
}
"abc12345".digits // "12345"
편집/업데이트:
스위프트 4.2
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self {
return filter(("0"..."9").contains)
}
}
또는 돌연변이 방법으로
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !("0"..."9" ~= $0) }
}
}
Swift 5.2 • Xcode 11.4 이상
Swift5에서는 다음과 같은 새로운 캐릭터 속성을 사용할 수 있습니다.isWholeNumber
:
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self { filter(\.isWholeNumber) }
}
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !$0.isWholeNumber }
}
}
기간을 허용하려면 Character를 확장하고 계산된 속성을 생성할 수 있습니다.
extension Character {
var isDecimalOrPeriod: Bool { "0"..."9" ~= self || self == "." }
}
extension RangeReplaceableCollection where Self: StringProtocol {
var digitsAndPeriods: Self { filter(\.isDecimalOrPeriod) }
}
운동장 테스트:
"abc12345".digits // "12345"
var str = "123abc0"
str.removeAllNonNumeric()
print(str) //"1230"
"Testing0123456789.".digitsAndPeriods // "0123456789."
Swift 4
문자열에서 알파벳 숫자만 설정하는 괜찮은 방법을 찾았습니다.예를 들어:-
func getAlphaNumericValue() {
var yourString = "123456789!@#$%^&*()AnyThingYouWant"
let unsafeChars = CharacterSet.alphanumerics.inverted // Remove the .inverted to get the opposite result.
let cleanChars = yourString.components(separatedBy: unsafeChars).joined(separator: "")
print(cleanChars) // 123456789AnyThingYouWant
}
filter
nrangeOfCharacterFromSet
let string = "sld [f]34é7*˜µ"
let alphaNumericCharacterSet = NSCharacterSet.alphanumericCharacterSet()
let filteredCharacters = string.characters.filter {
return String($0).rangeOfCharacterFromSet(alphaNumericCharacterSet) != nil
}
let filteredString = String(filteredCharacters) // -> sldf34é7µ
숫자 문자에 대해서만 필터링하려면
let string = "sld [f]34é7*˜µ"
let numericSet = "0123456789"
let filteredCharacters = string.characters.filter {
return numericSet.containsString(String($0))
}
let filteredString = String(filteredCharacters) // -> 347
아니면
let numericSet : [Character] = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
let filteredCharacters = string.characters.filter {
return numericSet.contains($0)
}
let filteredString = String(filteredCharacters) // -> 347
스위프트 4
그러나 확장명이나 구성요소가 없는 구분 문자InSet도 읽지 않습니다.
let allowedCharSet = NSCharacterSet.letters.union(.whitespaces)
let filteredText = String(sourceText.unicodeScalars.filter(allowedCharSet.contains))
let string = "+1*(234) fds567@-8/90-"
let onlyNumbers = string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
print(onlyNumbers) // "1234567890"
아니면
extension String {
func removeNonNumeric() -> String {
return self.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
}
}
let onlyNumbers = "+1*(234) fds567@-8/90-".removeNonNumeric()
print(onlyNumbers)// "1234567890"
스위프트 3, 숫자를 제외한 모든 것을 걸러냅니다.
let myString = "dasdf3453453fsdf23455sf.2234"
let result = String(myString.characters.filter { String($0).rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
print(result)
스위프트 4.2
let numericString = string.filter { (char) -> Bool in
return char.isNumber
}
당신은 이런 일을 할 수 있습니다.
let string = "[,myString1. \"" // string : [,myString1. "
let characterSet = NSCharacterSet(charactersInString: "[,. \"")
let finalString = (string.componentsSeparatedByCharactersInSet(characterSet) as NSArray).componentsJoinedByString("")
print(finalString)
//finalString will be "myString1"
stringByTrimmingCharactersInSet
애플의 문서에 명시된 바와 같이 문자열의 끝 부분만 필터링합니다.
지정된 문자 집합에 포함된 수신기 문자의 양쪽 끝에서 제거하여 만든 새 문자열을 반환합니다.
대신 문자 집합의 발생하지 않는 모든 것을 배열로 분리하고 빈 문자열 구분자로 결합합니다.
"$$1234%^56()78*9££".componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "0123456789").invertedSet)).joinWithSeparator("")
됩니다.123456789
스위프트 3
extension String {
var keepNumericsOnly: String {
return self.components(separatedBy: CharacterSet(charactersIn: "0123456789").inverted).joined(separator: "")
}
}
스위프트 4.0 버전
extension String {
var numbers: String {
return String(describing: filter { String($0).rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
}
}
스위프트 4
문자열.스위프트
import Foundation
extension String {
func removeCharacters(from forbiddenChars: CharacterSet) -> String {
let passed = self.unicodeScalars.filter { !forbiddenChars.contains($0) }
return String(String.UnicodeScalarView(passed))
}
func removeCharacters(from: String) -> String {
return removeCharacters(from: CharacterSet(charactersIn: from))
}
}
ViewController.swift
let character = "1Vi234s56a78l9"
let alphaNumericSet = character.removeCharacters(from: CharacterSet.decimalDigits.inverted)
print(alphaNumericSet) // will print: 123456789
let alphaNumericCharacterSet = character.removeCharacters(from: "0123456789")
print("no digits",alphaNumericCharacterSet) // will print: Vishal
스위프트 4.2
let digitChars = yourString.components(separatedBy:
CharacterSet.decimalDigits.inverted).joined(separator: "")
스위프트 3 버전
extension String
{
func trimmingCharactersNot(in charSet: CharacterSet) -> String
{
var s:String = ""
for unicodeScalar in self.unicodeScalars
{
if charSet.contains(unicodeScalar)
{
s.append(String(unicodeScalar))
}
}
return s
}
}
언급URL : https://stackoverflow.com/questions/36594179/remove-all-non-numeric-characters-from-a-string-in-swift
'programing' 카테고리의 다른 글
NuGet: PowerShell 또는 CMD를 통해 모든 프로젝트의 특정 버전으로 패키지 업데이트 (0) | 2023.10.16 |
---|---|
상품을 추가할 때 우커머스 상품 카테고리가 누락(표시되지 않음)되었습니다. (0) | 2023.10.16 |
iPython 노트북에서 디버그하는 올바른 방법은 무엇입니까? (0) | 2023.10.16 |
주 ()에 있는 주 ()를 c로 호출하기 (0) | 2023.10.16 |
WooCommerce 3의 상점 페이지에 있는 상품 페이지에 더 연결된 읽기로 카트에 추가하기 버튼 바꾸기 (0) | 2023.10.16 |