当前位置: 首页 > 面试题库 >

Swift字符串中子字符串的索引

有睿
2023-03-14
问题内容

我曾经在JavaScript中这样做:

var domains = "abcde".substring(0, "abcde".indexOf("cd")) // Returns "ab"

Swift没有此功能,如何做类似的事情?


问题答案:

编辑/更新:

Xcode 11•Swift 5.1或更高版本

import Foundation

extension StringProtocol {
    func index<S: StringProtocol>(of string: S, options: String.CompareOptions = []) -> Index? {
        range(of: string, options: options)?.lowerBound
    }
    func endIndex<S: StringProtocol>(of string: S, options: String.CompareOptions = []) -> Index? {
        range(of: string, options: options)?.upperBound
    }
    func indices<S: StringProtocol>(of string: S, options: String.CompareOptions = []) -> [Index] {
        var indices: [Index] = []
        var startIndex = self.startIndex
        while startIndex < endIndex,
            let range = self[startIndex...]
                .range(of: string, options: options) {
                indices.append(range.lowerBound)
                startIndex = range.lowerBound < range.upperBound ? range.upperBound :
                    index(range.lowerBound, offsetBy: 1, limitedBy: endIndex) ?? endIndex
        }
        return indices
    }
    func ranges<S: StringProtocol>(of string: S, options: String.CompareOptions = []) -> [Range<Index>] {
        var result: [Range<Index>] = []
        var startIndex = self.startIndex
        while startIndex < endIndex,
            let range = self[startIndex...]
                .range(of: string, options: options) {
                result.append(range)
                startIndex = range.lowerBound < range.upperBound ? range.upperBound :
                    index(range.lowerBound, offsetBy: 1, limitedBy: endIndex) ?? endIndex
        }
        return result
    }
}

用法:

let str = "abcde"
if let index = str.index(of: "cd") {
    let substring = str[..<index]   // ab
    let string = String(substring)
    print(string)  // "ab\n"
}
let str = "Hello, playground, playground, playground"
str.index(of: "play")      // 7
str.endIndex(of: "play")   // 11
str.indices(of: "play")    // [7, 19, 31]
str.ranges(of: "play")     // [{lowerBound 7, upperBound 11}, {lowerBound 19, upperBound 23}, {lowerBound 31, upperBound 35}]

不区分大小写的样本

let query = "Play"
let ranges = str.ranges(of: query, options: .caseInsensitive)
let matches = ranges.map { str[$0] }   //
print(matches)  // ["play", "play", "play"]

正则表达式样本

let query = "play"
let escapedQuery = NSRegularExpression.escapedPattern(for: query)
let pattern = "\\b\(escapedQuery)\\w+"  // matches any word that starts with "play" prefix

let ranges = str.ranges(of: pattern, options: .regularExpression)
let matches = ranges.map { str[$0] }

print(matches) //  ["playground", "playground", "playground"]


 类似资料:
  • 我习惯于在JavaScript中这样做: 斯威夫特没有这个功能,怎么做类似的东西?

  • 问题内容: 我的主字符串是“ hello Swift Swift和Swift”,子字符串是Swift。我需要获取子字符串“ Swift”在提到的字符串中出现的次数。 此代码可以确定模式是否存在。 现在我需要知道发生的次数。 问题答案: 一种简单的方法是分割,然后从零件数中减去1: 此代码打印3。 编辑: 在Swift 3语法之前,代码如下所示:

  • 问题内容: 我有: 功能: 和一个字符串:, 我本质上是想输入并返回,但是我却不断地返回。 码: 不知道怎么了! 问题答案: 理想情况下,您会 像痴呆的刺猬说的那样 使用 str.find 或 str.index 。但是你说你不能… 您的问题是您的代码仅搜索搜索字符串的第一个字符(第一个字符在索引2)。 您基本上是说if是in ,递增直到我测试它返回3时,但这仍然是错误的。这是一种方法。 它产生了

  • 问题内容: 我刚刚发现,根据我们执行最多的查询,当前的数据库设计效率有些低下。IBAN是根据国家/地区特定格式的位置坐标。 由于我们主要在某些表中的IBAN列的精确子字符串上执行s和s,因此我的问题是将索引分配给列的子字符串 我们是否被迫向表中添加冗余和索引列?IE。添加列,,,,,(其中IT_字段只考虑在开始ITXX帐户)每一个与适当的二级索引 或 是否有任何特殊的二级索引的,可以仅在一列的子串

  • 问题内容: 有没有一种简单的方法来测试Python字符串“ xxxxABCDyyyy”,以查看其中是否包含“ ABCD”? 问题答案: if “ABCD” in “xxxxABCDyyyy”: # whatever

  • Swift 4中的字符串是一个有序的字符集合,例如。 它们由Swift 4数据类型表示,也是由字符类型值的集合来表示。 1. 创建字符串 可以使用字符串文字或创建类的实例来创建字符串,如下所示 - 编译并执行上述代码时,会产生以下结果 - 2. 空字符串 可以通过使用空字符串文字或创建类的实例来创建空字符串,如下所示。还可以使用布尔属性检查字符串是否为空。参考以下示例代码 - 编译并执行上述代码时