[英]Getting a empty Range<String.Index> in Swift
我對 Swift 非常陌生,並且嘗試使用正則表達式,但從字符串中獲取匹配似乎是一項無法克服的任務。
這是我目前的做法。
print(data.substring(with: (data.range(of: "[a-zA-Z]at", options: .regularExpression))))
這不起作用,因為
Value of optional type 'Range<String.Index>?' must be unwrapped to a value of type 'Range<String.Index>'
我想這可能與它可能是 null 有關,所以現在我想為它提供一個替代方案? 操作員。
print(data.substring(with: (data.range(of: "[a-zA-Z]at", options: .regularExpression)?? Range<String.Index>())))
我想要做的是為它提供一個空范圍 object 但似乎不可能創建所需類型的空 object 。
有什么建議么?
Range<String.Index>
根本沒有無參數的初始化程序。
創建空范圍String.Index
的一種方法是使用:
data.startIndex..<data.startIndex
請記住,您不應該在這里使用整數,因為我們正在處理字符串的索引。 如果你不明白為什么,請看這個。
所以:
print(data.substring(with: (data.range(of: "[a-zA-Z]at", options: .regularExpression) ?? data.startIndex..<data.startIndex)))
但是不推薦使用substring(with:)
。 推薦使用下標:
print(data[data.range(of: "[a-zA-Z]at", options: .regularExpression) ?? data.startIndex..<data.startIndex])
我建議不要嘗試創建一個空范圍,而是創建一個空的Substring
以防不匹配。 Range
可能很容易出錯,因此使用這種方法可以省去很多麻煩。
let match: Substring
if let range = data.range(of: "[a-zA-Z]at", options: .regularExpression) {
match = data[range]
} else {
match = ""
}
print(match)
您可以使用 Range 類型的簡單擴展來創建此類構造函數。 像這樣:
extension Range where Bound == String.Index {
static var empty: Range<Bound> {
"".startIndex..<"".startIndex
}
init() {
self = Range<Bound>.empty
}
}
然后可以這樣使用:
let str = "kukukukuku"
let substr1 = str[str.range(of: "abc", options: .regularExpression) ?? Range<String.Index>()]
let substr2 = str[str.range(of: "abc", options: .regularExpression) ?? Range<String.Index>.empty]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.