신속하게 문자열에서 숫자가 아닌 모든 문자를 제거하십시오.
숫자 값이어야하지만 공백이나 기타 영숫자가 아닌 문자를 포함 할 수있는 일부 알려지지 않은 데이터를 구문 분석해야합니다.
Swift에서이 작업을 수행하는 새로운 방법이 있습니까? 내가 온라인에서 찾을 수있는 것은 일을하는 오래된 C 방식 인 것 같다.
내가보고 있어요 stringByTrimmingCharactersInSet- 나는 확실히 내 입력은 문자열의 시작 또는 끝에서 공백 / 특수 문자를해야합니다 생각한다. 이를 위해 사용할 수있는 내장 문자 세트가 있습니까? 아니면 직접 만들어야합니까?
stringFromCharactersInSet()유지할 유효한 문자 만 지정할 수 있는 것과 같은 것이 있기를 바랐습니다.
유지할 유효한 문자 만 지정할 수있는 stringFromCharactersInSet () 같은 것이 있기를 바랐습니다.
문자 세트 trimmingCharacters와 함께 사용 inverted하여 문자열의 시작 또는 끝에서 문자를 제거 할 수 있습니다 . Swift 3 이상 :
let result = string.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)
또는, 당신은 어디 문자열 (시작 또는 끝이 아니라)에 숫자가 아닌 문자를 제거하려는 경우, 당신이 할 수 , 예를 들어 스위프트 4.2.1 :filtercharacters
let result = string.filter("0123456789.".contains)
또는 특정 형식 (예 :)의 유효한 문자열 만 일치 시키려면 ####.##정규식을 사용할 수 있습니다. 예를 들면 :
if let range = string.range(of: "\\d+(\\.\\d*)?", options: .regularExpression) {
let result = string[range] // or `String(string[range])` if you need `String`
}
이러한 다른 접근 방식의 동작은 약간 다르므로 수행하려는 작업에 따라 다릅니다. 소수 또는 정수만 원하는 경우 소수점을 포함하거나 제외합니다. 이를 수행하는 방법에는 여러 가지가 있습니다.
이전 Swift 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()
}
}
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기능을 이용한 솔루션rangeOfCharacterFromSet
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
범위에 대한 패턴 일치 연산자를 사용하여 문자열의 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 • Xcode 10.2
Swift5에서는 다음과 같은 새로운 Character 속성을 사용할 수 있습니다 isNumber.
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self {
return filter({ $0.isNumber })
}
}
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !$0.isNumber }
}
}
놀이터 테스트 :
"abc12345".digits // "12345"
var str = "123abc0"
str.removeAllNonNumeric()
print(str) //"1230"
스위프트 4
But without extensions or componentsSeparatedByCharactersInSet which doesn't read as well.
let allowedCharSet = NSCharacterSet.letters.union(.whitespaces)
let filteredText = String(sourceText.unicodeScalars.filter(allowedCharSet.contains))
Swift 3, filters all except numbers
let myString = "dasdf3453453fsdf23455sf.2234"
let result = String(myString.characters.filter { String($0).rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
print(result)
You can do something like this...
let string = "[,myString1. \"" // string : [,myString1. "
let characterSet = NSCharacterSet(charactersInString: "[,. \"")
let finalString = (string.componentsSeparatedByCharactersInSet(characterSet) as NSArray).componentsJoinedByString("")
print(finalString)
//finalString will be "myString1"
The issue with Rob's first solution is stringByTrimmingCharactersInSet only filters the ends of the string rather than throughout, as stated in Apple's documentation:
Returns a new string made by removing from both ends of the receiver characters contained in a given character set.
Instead use componentsSeparatedByCharactersInSet to first isolate all non-occurrences of the character set into arrays and subsequently join them with an empty string separator:
"$$1234%^56()78*9££".componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "0123456789").invertedSet)).joinWithSeparator("")
Which returns 123456789
Swift 3
extension String {
var keepNumericsOnly: String {
return self.components(separatedBy: CharacterSet(charactersIn: "0123456789").inverted).joined(separator: "")
}
}
Swift 4.0 version
extension String {
var numbers: String {
return String(describing: filter { String($0).rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
}
}
Swift 4
String.swift
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
Swift 3 Version
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
}
}
Swift 4.2
let digitChars = yourString.components(separatedBy:
CharacterSet.decimalDigits.inverted).joined(separator: "")
Swift 4.2
let numericString = string.filter { (char) -> Bool in
return char.isNumber
}
let string = "+1*(234) fds567@-8/90-"
let onlyNumbers = string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
print(onlyNumbers) // "1234567890"
or
extension String {
func removeNonNumeric() -> String {
return self.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
}
}
let onlyNumbers = "+1*(234) fds567@-8/90-".removeNonNumeric()
print(onlyNumbers)// "1234567890"
'Program Club' 카테고리의 다른 글
| ios facebook sdk 4.0 로그인 오류 코드 304 (0) | 2020.11.25 |
|---|---|
| 파이썬에서 두 개의 n 차원 벡터 사이의 각도 (0) | 2020.11.25 |
| Java에서 문자열의 문자를 어떻게 바꾸나요? (0) | 2020.11.25 |
| 투표 경쟁에서 사기꾼 사냥 (0) | 2020.11.24 |
| IContainer 해결 (0) | 2020.11.24 |