【问题标题】:Substrings in SwiftSwift 中的子字符串
【发布时间】:2015-01-04 14:40:40
【问题描述】:

我在理解如何在 Swift 中使用子字符串时遇到了问题。基本上,我得到的 JSON 值具有以下格式的字符串:

<a href="#">Something</a>

我正在尝试使用 Swift 摆脱 HTML 锚标记,所以我只剩下Something。我的想法是在字符串中找到每个 &lt;&gt; 的索引,这样我就可以做一个 substringWithRange 并前进到正确的索引。

我的问题是我不知道如何找到索引。我读过 Swift 不支持索引(除非你扩展它。)

我不想不必要地增加 CPU 周期。所以我的问题是,我如何以一种不低效的方式找到索引?或者,有没有更好的过滤标签的方法?

编辑:将 Andrew 的第一个代码示例转换为函数:

func formatTwitterSource(rawStr: String) -> String {
    let unParsedString = rawStr
    var midParseString = ""
    var parsedString = ""

    if let firstEndIndex = find(unParsedString, ">") {
        midParseString = unParsedString[Range<String.Index>(start: firstEndIndex.successor(), end: unParsedString.endIndex)]
        if let secondStartIndex = find(midParseString, "<") {
            parsedString = midParseString[Range<String.Index>(start: midParseString.startIndex, end: secondStartIndex)]
        }
    }          
    return parsedString
}

没什么太复杂的。它接受一个包含标签的字符串。然后它使用 Andrew 的魔法将所有内容解析出来。我重命名了变量并使它们更清晰,这样您就可以看到哪个变量在这个过程中做了什么。然后最后返回解析后的字符串。

【问题讨论】:

标签: swift substring


【解决方案1】:

你可以做这样的事情,但它并不漂亮。显然,您希望将此因素考虑到一个函数中,并可能允许使用各种开始/结束标记。

let testText = "<a href=\"#\">Something</a>"
if let firstEndIndex = find(testText, ">") {
    let testText2 = testText[Range<String.Index>(start: firstEndIndex.successor(), end: testText.endIndex)]
    if let secondStartIndex = find(testText2, "<") {
        let testText3 = testText2[Range<String.Index>(start: testText2.startIndex, end: secondStartIndex)]
    }
}

编辑

进一步研究这个并想出了一些更惯用的东西?

let startSplits = split(testText, { $0 == "<" })
let strippedValues = map(startSplits) { (s) -> String? in
    if let endIndex = find(s, ">") {
        return s[Range<String.Index>(start: endIndex.successor(), end: s.endIndex)]
    }
    return nil
}
let strings = map(filter(strippedValues, { $0 != "" })) { $0! }

它在最后使用了更多功能样式。与 Haskell 相比,我不确定我是否更喜欢 map/filter 的 Swift 风格。但无论如何,一个潜在的危险部分是在最终的map 中强制展开。如果您可以接受[String?] 的结果,则没有必要。

【讨论】:

  • 是的,我目前正在将其重写为函数并添加必要的参数和返回类型。还添加了更多内容以使其更加全面,但我所需要的只是基础。谢谢!
  • @ShaanSingh 或许可以查看我发布的新版本。它更灵活一些,但仍需要转换为将拆分标记作为参数。
  • 天哪,太好了!我编辑了我的问题,向您展示我如何为旧版本设置功能。不过这个稍微好看一点。绝对更灵活。
  • 我会开始设置这个。
  • 确实如此——它不能完全替代 NSAttributedString 上的 UIKit 扩展,但它确实专门解决了这个问题。
【解决方案2】:

尽管这个问题已经得到解答,但我正在添加基于正则表达式的解决方案。

let pattern = "<.*>(.*)<.*>"
let src = "<a href=\"#\">Something</a>"
var error: NSError? = nil

var regex = NSRegularExpression(pattern: pattern, options: .DotMatchesLineSeparators, error: &error)

if let regex = regex {
    var result = regex.stringByReplacingMatchesInString(src, options: nil, range: NSRange(location:0,
    length:countElements(src)), withTemplate: "$1")
    println(result)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2017-02-02
    • 1970-01-01
    相关资源
    最近更新 更多