簡體   English   中英

獲得一個空的范圍<string.index>在 Swift</string.index>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM