【问题标题】:Swift 4: return Substring index from a String [duplicate]Swift 4:从字符串返回子字符串索引
【发布时间】:2023-04-04 10:52:01
【问题描述】:

我在这里检查了很多类似的问题,但这些问题的答案对我来说似乎不是一个可行的解决方案。我正在将格式化的文件读入字符串"Substring #1: Hello World!; Substring #2: My name is Tom; Substring #X: This is another substring"。我需要找到Substring #1 的索引来打印其内容(Hello World!),稍后在代码中我需要打印Substring #2 的内容(My name is Tom)等等。

到目前为止我已经尝试过:

String.index(of: subString) - Xcode 错误:

无法将“字符串”类型的值转换为预期的参数类型 '角色'

String.firstIndex(of: subString) - Xcode 错误:`

无法将“字符串”类型的值转换为预期的参数类型 '角色'

这样做的有效方法是什么?

【问题讨论】:

  • 我认为您应该详细说明您的示例并向我们展示您的尝试。
  • 我找到了 String.index(of: "subString"),但是这在 Swift 4 中不起作用; String.range(of: "subString") 在我需要索引时返回一长段代码
  • 现在有一个叫firstIndex的东西。
  • 你能告诉我们你做了什么吗?你说你“它似乎只接受字符,这对于 Substring #1 ... Substring #9 但是我不能使用它,如果 String 包含 Substring #10 和更大”但是,我们没有看到这一点。
  • 那么子字符串已经在数组中了?因为这就是我要让它更容易的建议,所以拆分字符串并将各个部分放在一个数组中。如果您提供更多关于您所拥有的一些代码的信息,这将非常有帮助。

标签: swift string


【解决方案1】:

您可以使用正则表达式来匹配您的字符串,假设所有子字符串都以 ; 或字符串结尾。

这是您应该使用的正则表达式:

Substring #(\d+): (.+?)(?:;|$)

它将子字符串编号捕获到组 1 中,将子字符串捕获到组 2 中。

你可以这样使用它:

extension String {
    func substring(withNSRange range: NSRange) -> String {
        return String(string[Range(range, in: self)!])
    }
}

let string = "Substring #1: Hello World!; Substring #2: My name is Tom"
let regex = try! NSRegularExpression(pattern: "Substring #(\\d+): (.+?)(?:;|$)", options: [])
let matches = regex.matches(in: string, options: [], range: NSRange(location: 0, length: string.utf16.count))
let tuples = matches.map { (Int(string.substring(withNSRange: $0.range(at: 1))), string.substring(withNSRange: $0.range(at: 2))) }
let dict = Dictionary(uniqueKeysWithValues: tuples)

// dict will contain something like [1: Hello World!, 2: My name is Tom]

编辑:

假设子字符串的自定义结尾存储在名为customStringEnd 的变量中,您可以像这样创建正则表达式:

let regex = try! NSRegularExpression(pattern: "Substring #(\\d+): (.+?)(?:\(NSRegularExpression.escapedPattern(for: customStringEnd))|$)", options: [])

【讨论】:

  • 我真的是编程新手,尤其是 Swift。你能告诉我我需要在你的代码中修改什么,以防子字符串以另一个符号结尾,例如</、|| 或 customSubstringEnd?
  • 看到正则表达式末尾的; 了吗?只需将其替换为字符串的结尾即可。请记住转义正则表达式中具有特殊含义的字符,例如|。对于</,它将是Substring #(\d+): (.+?)(?:</|$)。对于||,它将是Substring #(\d+): (.+?)(?:\|\||$)。 @GasperJ。
  • @GasperJ。我已将最一般的情况编辑为答案
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 2018-04-30
  • 2015-11-25
相关资源
最近更新 更多