【问题标题】:Find index of Nth instance of substring in string in Swift在 Swift 中查找字符串中子字符串的第 N 个实例的索引
【发布时间】:2016-09-06 22:37:09
【问题描述】:

我的 Swift 应用程序涉及在 UITextView 中搜索文本。用户可以在该文本视图中搜索某个子字符串,然后跳转到该文本视图中该字符串的任何实例(例如,第三个实例)。我需要找出它们在哪个字符上的整数值。

例如:

示例 1: 用户搜索“hello”,文本视图显示“hey hi hello, hey hi hello”,然后用户按向下箭头查看第二个实例。我需要知道第二个 hello 中第一个 h 的整数值(即 hello 中的哪个 # 字符在文本视图中)。整数值应为22

示例 2: 用户搜索“abc”,而文本视图读取“abcd”,他们正在寻找abc 的第一个实例,因此整数值应为1 (这是 a 的整数值,因为它是他们正在搜索的实例的第一个字符)。

如何获取用户正在搜索的字符的索引?

【问题讨论】:

标签: ios swift string swift2


【解决方案1】:

Xcode 11 • Swift 5 或更高版本

let sentence = "hey hi hello, hey hi hello"
let query = "hello"
var searchRange = sentence.startIndex..<sentence.endIndex
var indices: [String.Index] = []

while let range = sentence.range(of: query, options: .caseInsensitive, range: searchRange) {
    searchRange = range.upperBound..<searchRange.upperBound
    indices.append(range.lowerBound)
}

print(indices)   // "[7, 21]\n"

【讨论】:

  • 输出将类似于 [Swift.String.Index(_rawBits: 1), Swift.String.Index(_rawBits: 524288)]
  • 是的,它在 Swift 进化过程中的某个地方发生了变化,但它是正确的。
【解决方案2】:

另一种方法是NSRegularExpression,它旨在轻松遍历字符串中的匹配项。如果您使用.ignoreMetacharacters 选项,它不会应用任何复杂的通配符/正则表达式逻辑,而只会查找有问题的字符串。所以考虑:

let string = "hey hi hello, hey hi hello"  // string to search within
let searchString = "hello"                 // string to search for
let matchToFind = 2                        // grab the second occurrence

let regex = try! NSRegularExpression(pattern: searchString, options: [.caseInsensitive, .ignoreMetacharacters])

你可以使用enumerateMatches:

var count = 0
let range = NSRange(string.startIndex ..< string.endIndex, in: string)
regex.enumerateMatches(in: string, range: range) { result, _, stop in
    count += 1
    if count == matchToFind {
        print(result!.range.location)
        stop.pointee = true
    }
}

或者您可以使用matches(in:range:) 找到所有这些,然后获取第 n 个:

let matches = regex.matches(in: string, range: range)
if matches.count >= matchToFind {
    print(matches[matchToFind - 1].range.location)
}

显然,如果您愿意,您可以省略 .ignoreMetacharacters 选项并允许用户执行正则表达式搜索(例如通配符、全词搜索、词首等)。

对于 Swift 2,请参阅 previous revision of this answer

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 2021-12-18
    • 2010-12-25
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多