我曾经在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. 空字符串 可以通过使用空字符串文字或创建类的实例来创建空字符串,如下所示。还可以使用布尔属性检查字符串是否为空。参考以下示例代码 - 编译并执行上述代码时