簡體   English   中英

如何從完整字符串iOS Swift中為一個字符串查找多個NSRange

[英]How to find Multiple NSRange for a string from full string iOS swift

let fullString = "Hello world, there are \(string(07)) continents and \(string(195)) countries."
let range = [NSMakeRange(24,2), NSMakeRange(40,3)]

需要在整個完整字符串中找到數字的NSRange,並且兩個數字可能相同。 當前如上所示的硬編碼,該消息可以是動態的,其中硬編碼值將是有問題的。

我已經拆分了字符串,並嘗試獲取NSRange因為可能存在相同的值。 像stringOne和stringTwo。

func findNSMakeRange(initialString:String, fromString: String) {
        let fullStringRange = fromString.startIndex..<fromString.endIndex
        fromString.enumerateSubstrings(in: fullStringRange, options: NSString.EnumerationOptions.byWords) { (substring, substringRange, enclosingRange, stop) -> () in
            let start = distance(fromString.startIndex, substringRange.startIndex)
            let length = distance(substringRange.startIndex, substringRange.endIndex)
            let range = NSMakeRange(start, length)

            if (substring == initialString) {
                print(substring, range)
            }
        })
    }

接收到諸如Cannot invoke distance with an argument list of type (String.Index, String.Index)錯誤

有人有更好的解決方案嗎?

另一種方法是定義擴展以返回范圍數組,即[Range<String.Index>]

extension StringProtocol where Index == String.Index {
    func ranges<T: StringProtocol>(of string: T, options: String.CompareOptions = []) -> [Range<Index>] {
        var ranges: [Range<Index>] = []
        var start: Index = startIndex

        while let range = range(of: string, options: options, range: start..<endIndex) {
            ranges.append(range)
            start = range.upperBound
        }

        return ranges
    }
}

然后,您可以像這樣使用它:

let string = "Hello world, there are 09 continents and 195 countries."
let ranges = string.ranges(of: "[0-9]+", options: .regularExpression)

因此,例如,如果您想在某些屬性字符串中將這些數字設為粗體:

string.ranges(of: "[0-9]+", options: .regularExpression)
    .map { NSRange($0, in: string) }
    .forEach {
        attributedString.setAttributes(boldAttributes, range: $0)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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