【问题标题】:How to remove all chars except those in CharacterSet in Swift如何在 Swift 中删除除 CharacterSet 之外的所有字符
【发布时间】:2015-08-28 11:18:49
【问题描述】:

我正在尝试修剪电话号码并使用以下代码,但它不会修剪空格或“-”。我需要删除所有字符,除了给定字符集中的字符

 func trimmedNumber(s : String)->String
 {
    let characterSet = NSCharacterSet(charactersInString: "+*#0123456789")
   let trimmedString =  s.stringByTrimmingCharactersInSet(characterSet.invertedSet)
    return trimmedString
}

【问题讨论】:

  • 您的代码完全符合您的要求。我在游乐场尝试过,它正在删除空格和“-”。 (screenshot)
  • @EricD。在字符串“5467-rf34”上试一试。此代码不起作用。
  • @egor.zhdan 实际上这是意料之中的:documentation 表示 stringByTrimmingCharactersInSet “返回一个新字符串,该字符串通过从给定字符中包含的接收者字符的 两端 中删除设置。”
  • @EricD。是的,我明白了,但不知道如何不仅从字符串的末尾删除字符。

标签: ios swift


【解决方案1】:

斯威夫特 3/4:

let set = CharacterSet(charactersIn: "+*#0123456789")
let stripped = s.components(separatedBy: set.inverted).joined()

【讨论】:

  • 我无法从我的文本字段中删除字符
【解决方案2】:
func trimmedNumber(s : String) -> String {
  let characterSet = Set("+*#0123456789".characters)
  return String(s.characters.lazy.filter(characterSet.contains))
}

或者在 Swift 1 中:

func trimmedNumber(s : String) -> String {
  let characterSet = Set("+*#0123456789")
  return String(lazy(s).filter { characterSet.contains($0) })
}

【讨论】:

  • 使用上面的lazy会节省内存吗?
【解决方案3】:

removingCharacters(in:) 方法添加到 Swift 的 String 类型中。它返回一个新字符串,该字符串是通过从String 中删除给定字符集中的字符而生成的。

例如:

let string = "+1-202-555-0141"
let set = CharacterSet(charactersIn: "+*#0123456789")
let sanitized = string.removingCharacters(in: set.inverted)
// sanitized is equal to "+12025550141"

Helpers.swift

extension String {
  public func removingCharacters(in set: CharacterSet) -> String {
    let filtered = unicodeScalars.filter { !set.contains($0) }
    return String(String.UnicodeScalarView(filtered))
  }
}

HelpersTests.swift

import XCTest

class HelpersTests: XCTestCase {
  func testRemovingCharacters() {
    let inputText1 = ""
    let set1 = CharacterSet.decimalDigits.inverted
    let sanitized1 = inputText1.removingCharacters(in: set1)
    XCTAssertEqual("", sanitized1)

    let inputText2 = " tab:\tspace: no-break_space: "
    let set2 = CharacterSet.whitespaces
    let sanitized2 = inputText2.removingCharacters(in: set2)
    XCTAssertEqual("tab:space:no-break_space:", sanitized2)

    let inputText3 = " aBc!@#12 $%^&*()-_=+[{]}\\|;:'\"3,<.>/?`~ "
    let set3 = CharacterSet.alphanumerics.inverted
    let sanitized3 = inputText3.removingCharacters(in: set3)
    XCTAssertEqual("aBc123", sanitized3)
  }
}

另请参阅:Convert Array of UnicodeScalar into String in Swift

【讨论】:

  • 你为什么在unicodeScalars.lazy.filter中选择lazy?我们不是在它下面使用它吗?
  • @MichalŠrůtek,感谢您的提问。好问题!我不知道。我曾问过关于oisdk's answer 的类似问题。我认为你是对的,所以我从unicodeScalars.lazy 中删除了.lazy。谢谢! :-)
【解决方案4】:

适用于 swift 1&2

let s = "adasdad+3124124+r323*4asdasdbk*($&#@"

let characterSet = NSCharacterSet(charactersInString: "+*#0123456789").invertedSet;
let elements = s.componentsSeparatedByCharactersInSet(characterSet)
let filtered = (elements as NSArray).componentsJoinedByString("")

print(filtered);
    

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 2020-02-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多