【问题标题】:How to get a value in a string after special character [closed]如何在特殊字符后获取字符串中的值[关闭]
【发布时间】:2019-12-13 04:41:22
【问题描述】:

我需要在字符之前撕掉字符串中的一些数据。

我需要把字符串前面的数字撕掉。

var str= "123456Z789456123"        // output: Z789456123
var str= "123456K789456123"        // output: K789456123
var str= "1234U789456123"          // output: U789456123
var str= "123456909D789456123"     // output: D789456123

我无法找到解决方案。

【问题讨论】:

    标签: swift regex split


    【解决方案1】:

    两个选项(还有更多):

    1. Scanner

      let str = "123456Z789456123"
      let scanner = Scanner(string: str)
      var output : NSString?
      scanner.scanUpToCharacters(from: .letters, into: nil)
      scanner.scanCharacters(from: .alphanumerics, into: &output)
      print(output! as String)
      
    2. 正则表达式搜索第一个非数字字符

      let str = "123456Z789456123"
      let range = str.range(of: "\\D", options: .regularExpression)!
      let output = str[range.lowerBound...]
      

    【讨论】:

    • 优秀。但 scanUpToCharacters(from:into:)scanCharacters(from:into:) 在 iOS 13.0 中将被弃用
    • 在iOS 13中变得更加方便:删除var output : NSString?并更改scanner.scanUpToCharacters(from: .letters)let output = scanner.scanCharacters(from: .alphanumerics)
    【解决方案2】:
    var str = "123456Z789456123"
    let characterSet = CharacterSet(charactersIn: "ZKUD")
    let firstIndex = str.firstIndex { characterSet.contains($0.unicodeScalars.first!) }
    let substr = str[firstIndex!...]
    

    或者使用扩展:

    var str = "123456Z789456123"        // output: Z789456123
    
    extension String {
    
        func strip(before characterSet: CharacterSet) -> String {
            if let firstIndex = self.firstIndex(where: { characterSet.contains($0.unicodeScalars.first!) }) {
                return String(self[firstIndex...])
            }
            return self
        }
    
        func stripBeforeLetters() -> String {
            return strip(before: .letters)
        }
    
    }
    
    let substr = str.strip(before: CharacterSet(charactersIn: "ZKUD"))
    let anotherSubstr = str.stripBeforeLetters()
    

    【讨论】:

      【解决方案3】:

      这是一个简洁的单行:

      let subStr = String(str.drop { $0.isNumber })
      

      通过检查.isNumber.isWholeNumber 字符属性,只要它们是数字,它就会从字符串的开头开始drop 字符。

      【讨论】:

      • 请注意,isNumber 将允许像 这样的字符,这可能不是 OP 所期望的
      • @LeoDabus 因此.isWholeNumber 提出了替代方案。无论如何,这只是一个边缘情况,我认为这不是问题的一部分。
      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2021-02-12
      • 2021-03-03
      • 1970-01-01
      • 2016-02-28
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多