快速解析字符串

时间:2016-02-24 18:43:20

标签: string swift

我在String中有一个巨大的文字。

例如"... value=word. ..."。如果我知道string "word"之前"value=""."之后我该如何获得for str in string { if str == "value=" { // then get the strings until . } }

例如:

  <rule name="secondLevel">
      <match url="^folder/(.+)/(.+)/?$" ignoreCase="true" />
      <action type="Rewrite" url="firstsecond.aspx?param1={C:1}&amp;param2={C:2}" />
      <conditions>
        <add input="{UNENCODED_URL}" pattern="/folder/([^/]+)/([^/]+)/?$" />
      </conditions>
  </rule>

谢谢!

4 个答案:

答案 0 :(得分:1)

您可以使用String方法扩展sliceBetween

import Foundation

extension String {
  func sliceFrom(start: String, to: String) -> String? {
    guard let s = rangeOfString(start)?.endIndex else { return nil }
    guard let e = rangeOfString(to, range: s..<endIndex)?.startIndex else { return nil }
    return self[s..<e]
  }
}

你会像这样使用它:

"... value=word. ...".sliceFrom("value=", to: ". ") // "word"

答案 1 :(得分:0)

最直接的方法是使用NSRegularExpression。 Tutorial

答案 2 :(得分:0)

NSRegularExpression应解决您的问题。

要使用它,您需要先了解Regex。在您的情况下,您可以使用value=[\\w]+[^.]+作为正则表达式模式。

以下代码将为您提供[String]对象包含value=allCharacterBeforeFirstPeriod

let regex = try NSRegularExpression(pattern: "value=[\\w]+[^.]+", options: [])
let nsStr = str as NSString
let array = regex.matchesInString(str, options: [], range: NSMakeRange(0, nsStr.length))
let results = array.map({ nsStr.substringWithRange($0.range) })

然后,如果您只需要value=之后的值,则可以使用其他map函数执行此操作:

results.map({ $0.stringByReplacingOccurrencesOfString("value=", withString: "") })

我已经使用10,000个字符String测试了代码。它在~0.3秒完成

答案 3 :(得分:0)

给出像这样的输入String

let text = "key0=value0&key1=value1&key2=value2"

你可以使用组织方法

let dict = text.characters.split("&").reduce([String:String]()) { (var result, keyValue) -> [String:String] in
        let chunks = keyValue.split("=")
        guard let first = chunks.first, last = chunks.last else { return result }
        let key = String(first)
        let value = String(last)
        result[key] = value
        return result
}

现在所有内容都存储在dict内,您可以轻松访问它

dict["key2"] // "value2"