【问题标题】:Find NSRanges of all substrings splitted by new lines查找由新行分割的所有子字符串的 NSRange
【发布时间】:2020-05-28 07:33:00
【问题描述】:

所以我有这段代码通过拆分新行来查找Ranges 子字符串:

let string = "hello\nhello"
let rangesSplittedByLines: [Range] = string.split(separator: "\n").compactMap {
    return string.range(of: $0)
}

但我需要这些范围为NSRange。 您将如何获得所有子字符串的 NSRange 数组?

【问题讨论】:

    标签: swift string nsrange


    【解决方案1】:

    您可以使用直接返回范围的正则表达式匹配,而不是拆分字符串并“重构”范围。 [^\n]+ 模式匹配一​​个或多个不是换行符的字符。示例:

    let string = "hello\nhello"
    
    let regex = try! NSRegularExpression(pattern: #"[^\n]+"#)
    let matches = regex.matches(in: string, range: NSRange(string.startIndex..., in: string))
    let ranges = matches.map { $0.range }
    
    print(ranges) // [{0, 5}, {6, 5}
    

    【讨论】:

      【解决方案2】:

      在闭包中从Range<String.Index> 创建一个NSRange

      let string = "hello\nhello"
      let rangesSplittedByLines: [NSRange] = string.split(separator: "\n").map {
          return NSRange(string.range(of: $0)!, in: string)
      }
      

      但是还有另一个问题。代码返回 [{0, 5}, {0, 5}],因为 range(of: 总是返回 first 匹配的范围。

      这解决了问题,它通过将起始索引移动到最近匹配后的位置来分割字符串

      let string = "hello\nhello"
      var startIndex = string.startIndex
      let rangesSplittedByLines: [NSRange] = string.split(separator: "\n").map {
          let subString = string[startIndex...]
          let swiftRange = subString.range(of: $0)!
          let nsRange = NSRange(swiftRange, in: string)
          startIndex = swiftRange.upperBound
          return nsRange
      }
      

      而且没有理由明确地将String 桥接到NSString

      但无论如何,nsranges 就像 Martin 的答案一样,正则表达式效率更高。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-01
        • 2016-08-29
        • 2013-04-25
        • 2012-10-24
        相关资源
        最近更新 更多