如何从完整字符串iOS Swift中为一个字符串查找多个NSRange

卡伦
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)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PHP在单个结果时显示字符串的第一个字符,但在多个结果时显示完整字符串

在一个字符串中查找多个子字符串而无需多次迭代

如何匹配包含Unicode字符的完整字符串?

在一个字符串中获取两个或多个字符串

如何在另一个字符串中查找长度可变的字符串

使用 for 循环在一个字符串中插入多个字符串

如何在Swift中检查一个字符串是否包含另一个字符串?

如何检查一个字符串中是否包含多个单词?

如何删除多个字符串中的最后一个字符?

如何在Swift 4上将多个UITextFields放入一个字符串中?

查找数组字符串中的第一个字符

如何查找一个字符串(或多个字符串)的一部分是否在列表Python内

查找一个字符串中有多少个条目在另一个字符串中

查找一个字符串是否包含在R中的另一个字符串中

如何从多个字符串变量声明一个字符串 C++

显示多个字符串列表中的一个字符串

Java使用嵌套循环在另一个字符串中查找一个字符串出现的次数

使用 for 循环在另一个字符串中查找一个字符串

在较大的字符串中查找子字符串的第一个字符的位置

Java用一个字符替换字符串中的多个字符

打印多个字符与打印一个字符串

如何查找字符是否是字符串中的最后一个字符?

如何在C中将多个字符串值存储为一个字符串?

如何使用getline将完整字符串存储到字符串数组中?

如何根据另一个字符串值中的字符串值为一列分配字符串值?

Python:从列表中查找与另一个字符串最接近的字符串

使用javascript在另一个字符串中查找字符串的位置

使用grep查找不在另一个字符串中的字符串

在另一个字符串中查找自定义变量字符串