【问题标题】:Swift : How to get the string before a certain character?Swift:如何获取某个字符之前的字符串?
【发布时间】:2015-04-02 20:18:40
【问题描述】:

如何快速获取某个字符之前的字符串?下面的代码是我在 Objective C 中的做法,但似乎无法在 Swift 中执行相同的任务。关于如何实现这一目标的任何提示或建议? rangeOfString 似乎在 swift 中根本不起作用(尽管 Swift 再次为我服务)。

NSRange range = [time rangeOfString:@" "];
NSString *startDate =
[time substringToIndex:range.location];

从上面的代码可以看出,我可以在 Objective C 中获取空格字符之前的字符串。

编辑:如果我尝试这样的事情

 var string = "hello Swift"
 var range : NSRange = string.rangeOfString("Swift")

我收到以下错误。

无法将表达式的类型 'NSString' 转换为类型 '(String, 选项:NSStringCompareOptions,范围:范围?,语言环境: NSLocale?)'

不确定我到底做错了什么或如何正确解决它。

【问题讨论】:

  • this answer 中,他们还在 Swift 中使用 rangeOfString 并且它似乎有效。
  • 我编辑了我的问题,以便更好地解释当我尝试应用您的解决方案时发生了什么。
  • 您可以使用Range 代替NSRangelet range : Range? = string.rangeOfString("Swift")。您也可以将String 转换为NSStringvar range : NSRange = (string as NSString).rangeOfString("Swift")

标签: ios swift


【解决方案1】:

使用 componentsSeparatedByString() 如下所示:

var delimiter = " "
var newstr = "token0 token1 token2 token3"
var token = newstr.components(separatedBy: delimiter)
print (token[0])

或者使用您的具体情况:

var delimiter = " token1"
var newstr = "token0 token1 token2 token3"
var token = newstr.components(separatedBy: delimiter)
print (token[0])

【讨论】:

  • 很棒的答案。我试图弄清楚如何使用 rangeOfString 完成这项任务,但这样效率更高。
【解决方案2】:

你可以对String类提供的rangeOfString()做同样的事情

let string = "Hello Swift"
if let range = string.rangeOfString("Swift") {
   let firstPart = string[string.startIndex..<range.startIndex]
   print(firstPart) // print Hello
}

你也可以用你的方法substringToIndex()实现它

let string = "Hello Swift"
if let range = string.rangeOfString("Swift") {
   firstPart = string.substringToIndex(range.startIndex)
   print(firstPart) // print Hello
}

Swift 3 更新:

let string = "Hello Swift"
if let range = string.range(of: "Swift") {
    let firstPart = string[string.startIndex..<range.lowerBound]
    print(firstPart) // print Hello
}

希望对你有所帮助;)

【讨论】:

    【解决方案3】:

    跟进 Syed Tariq 的回答:如果您只想要分隔符之前的字符串(否则,您会收到一个数组 [String]):

    var token = newstr.components(separatedBy: delimiter).first
    

    【讨论】:

      【解决方案4】:

      您可以在 Swift 4 或更高版本

      中使用方法prefix(upTo:)
      var string = "hello Swift"
      if let index = string.firstIndex(of: " ") {
          let firstPart = string.prefix(upTo: index)
          print(firstPart) // print hello
      }
      

      【讨论】:

        【解决方案5】:

        Swift 5 扩展

        extension String {
            func before(first delimiter: Character) -> String {
                if let index = firstIndex(of: delimiter) {
                    let before = prefix(upTo: index)
                    return String(before)
                }
                return ""
            }
            
            func after(first delimiter: Character) -> String {
                if let index = firstIndex(of: delimiter) {
                    let after = suffix(from: index).dropFirst()
                    return String(after)
                }
                return ""
            }
        }
        
        let str = "n1:lolz"
        str.before(first: ":") // n1
        str.after(first: ":") // lolz
        str.after(first: "z") // empty string
        str.before(first: "n") // empty string
        str.before(first: "g") // empty string
        

        我认为返回一个可选的String 是很有意义的(如果在分隔符之前或之后没有任何内容,则返回nil)。

        【讨论】:

          【解决方案6】:

          我的 2 美分 :-) 使用 Swift 3.0,类似于 PHP strstr

          extension String {
          
              func strstr(needle: String, beforeNeedle: Bool = false) -> String? {
                  guard let range = self.range(of: needle) else { return nil }
          
                  if beforeNeedle {
                      return self.substring(to: range.lowerBound)
                  }
          
                  return self.substring(from: range.upperBound)
              }
          
          }
          

          用法1

          "Hello, World!".strstr(needle: ",", beforeNeedle: true) // returns Hello
          

          用法2

          "Hello, World!".strstr(needle: " ") // returns World!
          

          【讨论】:

            【解决方案7】:

            如果您想要一个不涉及拉基础的解决方案,您可以使用find 和切片:

            let str = "Hello, I must be going."
            
            if let comma = find(str, ",") {
                let substr = str[str.startIndex..<comma]
                // substr will be "Hello"
            }
            

            如果你在没有找到这样的字符的情况下明确想要一个空字符串,你可以使用 nil-coalescing 运算符:

            let str = "no comma"
            let comma = find(str, ",") ?? str.startIndex
            let substr = str[str.startIndex..<comma]  // substr will be ""
            

            注意,与componentsSeparatedByString 技术不同,这不需要创建数组,并且只需要扫描到第一次出现的字符,而不是将整个字符串分解为以字符分隔的数组。

            【讨论】:

            • 是的......它工作......但是如果我想在某个字符之后获取字符串怎么办?
            • @Bhavin find(str, ",")?.successor()
            • @all find 不再在 Swift 2.0 中得到支持
            【解决方案8】:

            要在指定的字符串第一次出现之前将字符串变异为部分,您可以像这样扩展字符串:

            extension String {
            
                mutating func until(_ string: String) {
                    let components = self.components(separatedBy: string)
                    self = components[0]
                }
            
            }
            

            那么可以这样调用:

            var foo = "Hello Swift"
            foo.until(" Swift") // foo is now "Hello"
            

            【讨论】:

              【解决方案9】:

              你可以使用rangeOfString,但它返回的是Range&lt;String.Index&gt;类型,而不是NSRange

              let string = "hello Swift"
              if let range = string.rangeOfString("Swift") {
                  print(string.substringToIndex(range.startIndex))
              }
              

              【讨论】:

                【解决方案10】:
                let string = "Hello-world"
                if let range = string.range(of: "-") {
                let firstPart = string[(string.startIndex)..<range.lowerBound]
                 print(firstPart) 
                }
                

                输出是:你好

                【讨论】:

                  【解决方案11】:

                  下面是一个完整的组合

                  let string = "This a string split using * and this is left."
                  if let range = string.range(of: "*") {
                      let lastPartIncludingDelimiter = string.substring(from: range.lowerBound)
                      print(lastPartIncludingDelimiter) // print * and this is left.
                  
                      let lastPartExcludingDelimiter = string.substring(from: range.upperBound)
                      print(lastPartExcludingDelimiter) // print and this is left.
                  
                      let firstPartIncludingDelimiter = string.substring(to: range.upperBound)
                      print(firstPartIncludingDelimiter) // print This a string split using *
                  
                      let firstPartExcludingDelimiter = string.substring(to: range.lowerBound)
                      print(firstPartExcludingDelimiter) // print This a string split using
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 2013-02-07
                    • 1970-01-01
                    • 2018-08-21
                    • 1970-01-01
                    • 2021-01-09
                    • 1970-01-01
                    • 2013-03-28
                    • 1970-01-01
                    • 2022-11-23
                    相关资源
                    最近更新 更多