programing

문자열에서 숫자가 아닌 문자를 모두 빨리 제거

stoneblock 2023. 10. 16. 21:29

문자열에서 숫자가 아닌 문자를 모두 빨리 제거

알 수 없는 데이터를 구문 분석해야 하는데, 이 데이터는 숫자 값이어야 하지만 공백이나 기타 영숫자가 아닌 문자가 포함되어 있을 수 있습니다.

스위프트에서 새로운 방법이 있습니까?내가 온라인에서 찾을 수 있는 것은 낡은 C 방식뿐인 것 같습니다.

나는 보고있습니다.stringByTrimmingCharactersInSet- 제 입력에는 문자열의 시작 또는 끝에 공백/특수 문자만 있을 것으로 확신합니다.이것에 사용할 수 있는 내장 캐릭터 세트가 있습니까?아니면 나만의 것을 만들어야 합니까?

우리가 다른 사람들을 도와줄 수 있는stringFromCharactersInSet()그래서 내가 보관할 유효한 문자들만 지정할 수 있을 것입니다.

'StringFromCharacters' 같은 것이 있으면 좋겠다고 생각했습니다.보관할 유효한 문자만 지정할 수 있는 InSet().

사용하실 수 있습니다.trimmingCharacters와 함께inverted문자열의 시작 또는 끝에서 문자를 제거하는 문자 집합입니다.Swift 3 이후 버전:

let result = string.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)

또는 문자열의 어디에서나 숫자가 아닌 문자를 제거하려면 다음을 수행할 수 있습니다.filtercharacters, 예를 들어 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

}

filternrangeOfCharacterFromSet

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