【问题标题】:Swift advancedBy can't handle newline character "\r\n" [duplicate]Swift advancedBy 无法处理换行符“\r\n” [重复]
【发布时间】:2015-10-23 10:06:28
【问题描述】:

我今天在使用 Swift 2 时遇到了一个非常奇怪的问题。

我有这个简单的方法来提取基于 NSRange 的子字符串:

func substringWithRange(string: String, range: NSRange) -> String {
    let startIndex = string.startIndex.advancedBy(range.location)
    let endIndex = startIndex.advancedBy(range.length)
    let substringRange = Range<String.Index>(start: startIndex, end: endIndex)

    return string.substringWithRange(substringRange)
}

对于普通字符串或包含 unicode 字符的字符串,一切正常。但是一个字符串包含换行符“\r\n”,突然

let startIndex = string.startIndex.advancedBy(range.location)

总是比应有的大 1。

let string = "<html>\r\n var info={};</html>"
let range = NSMakeRange(9, 12)

let substring = substringWithRange(string, range: range)

//Expected: var info={};
//Actual: ar info={};<

//string.startIndex = 0
//range.location = 9
//startIndex after advancedBy = 10

有谁知道为什么 advancedBy 会那样做以及我该如何解决这个问题?

【问题讨论】:

  • 我没有看到任何问题。 \r\n 是一个字符。你为什么不把你的范围缩小到(8,11)
  • @t4nhpt:我不能,因为我从 NSRegularExpression 匹配中获得了 NSRange,我不知道是否有 \r\n
  • 您从 NSRange 创建 Swift 范围的方法不正确,您也会遇到其他特殊字符(例如表情符号)的问题。比较Swift extract regex matchesNSRange to Range<String.Index>
  • @MartinR:感谢您提供的链接!我使用了来自 [link]stackoverflow.com/questions/25138339/… 的您的方法 rangeFromNSRange,现在可以使用了。但是我还有一个问题:当我从上面的链接中获取您的示例并以编程方式创建 NSRange let str = "a????b????????c" let n1 = NSMakeRange(0, 3) // NSRange back to String range: let r2 = str.rangeFromNSRange(n1)! print(str.substringWithRange(r2)) 时,我得到“a????”但我希望“a????b”
  • @iONsky:NSString 将 Emoji 字符存储为两个 UTF-16 字符,因此长度为 3 的 NSRange 仅包含字母“a”和 Emoji。

标签: ios string swift newline swift2


【解决方案1】:

原因是 Swift 将\r\n 视为一个字符

let cr = "\r"
cr.characters.count // 1
let lf = "\n"
lf.characters.count // 1
let crlf = "\r\n"
crlf.characters.count // 1

【讨论】:

  • get_text.replacingOccurrences(of: String("\\n"), with: "\n")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2013-12-02
  • 1970-01-01
相关资源
最近更新 更多