【问题标题】:Swift - Finding a substring between two locations in a stringSwift - 在字符串中的两个位置之间查找子字符串
【发布时间】:2015-02-04 15:11:07
【问题描述】:

我有一个格式如下的字符串:“XbfdASF;FBACasc|Piida;bfedsSA|XbbnSF;vsdfAs|”

基本上它是一个 ID;ID|然后重复。

我有第一个 ID,我需要找到它的合作伙伴 示例:我有 'Piida',我需要在 ';' 之后找到它后面的字符串这是'bfedsSA'

我该怎么做?

我遇到的问题是 ID 的长度是动态的,所以我需要获取“|”的索引在我拥有“Piida”的 ID 之后,然后获取这些索引之间的字符串,在这种情况下应该是“bfedsSA”。

【问题讨论】:

  • 将数据结构编码为字符串有其作用,但放弃字符串的其他结构类型是不明智的。所以,一旦你得到你的字符串拆分,你会想要使用一个'Array of Pairs',或者,如果所有第一个元素都是唯一的,只需一个字典。为什么我在关于“如何拆分”的问题中提到这一点?因为StringLiteralConvertible 协议!在 Dictionary 上实现该协议(或更好地使用您自己的数据结构),然后您可以使用 `var data : [String:String] = "XBfdASF;....As|"

标签: string swift substring indexof


【解决方案1】:

有很多方法可以做到这一点,但最简单的方法是使用分隔符将字符串拆分为数组。

如果你了解 JavaScript,它相当于 .split() 字符串方法; Swift does have this functionality,但正如你所看到的,它可能会有点混乱。您可以扩展 String like this 使其更简单一些。为了完整起见,我将其包含在此处:

import Foundation

extension String {
    public func split(separator: String) -> [String] {
        if separator.isEmpty {
            return map(self) { String($0) }
        }
        if var pre = self.rangeOfString(separator) {
            var parts = [self.substringToIndex(pre.startIndex)]
            while let rng = self.rangeOfString(separator, range: pre.endIndex..<endIndex) {
                parts.append(self.substringWithRange(pre.endIndex..<rng.startIndex))
                pre = rng
            }
            parts.append(self.substringWithRange(pre.endIndex..<endIndex))
            return parts
        } else {
            return [self]
        }
    }
}

现在,您可以在这样的字符串上调用.split()

"test".split("e") // ["t", "st"]

所以,您首先应该做的是通过分隔符将您的 ID 字符串分成多个段,即|,因为这就是您的 ID 的分隔方式:

let ids: [String] = "XbfdASF;FBACasc|Piida;bfedsSA|XbbnSF;vsdfAs|".split("|")

现在,您的 ID 字符串数组如下所示:

["XbfdASF;FBACasc", "Piida;bfedsSA", "XbbnSF;vsdfAs"]

您的 ID 格式为 ID;VALUE,因此您可以像这样再次拆分它们:

let pair: [String] = ids[anyIndex].split(";") // ["ID", "VALUE"]

您可以访问该数组索引 0 处的 ID 和索引 1 处的值。

例子:

let id: String = ids[1].split(";")[0]
let code: String = ids[1].split(";")[1]

println("\(id): \(code)") // Piida: bfedsSA

【讨论】:

  • 实际上 Swift 一个 split() 函数,你可以在这里使用(参见stackoverflow.com/a/25229901/1187415 的例子)。
  • @MartinR 哇,这很有趣。我认为扩展 String 会使语法更简单一些,但我会记住这一点。
  • 很好的答案。快速提问:如何在数组中找到 ID 的索引?即我有 ID 'Piida' 在数组中找到它的索引的简短方法是什么?
  • @Displayname 当然:如果您将第一个数组再次拆分为 ;(而不是拆分其中的一个元素),然后使用 find() 返回的索引,则可以使用 find() 方法+ 1 获得第二个 ID。我也会以其他方式查看this question
  • @Displayname Here's 你将如何使用find()
猜你喜欢
  • 2014-12-07
  • 2011-03-23
  • 2020-05-28
  • 2013-09-13
  • 2013-03-27
相关资源
最近更新 更多