Swift 4.0-匹配字符串中对应字符所有NSRange

  • 方法一

extension String {
    /// 字符串的匹配范围 方法一
    ///
    /// - Parameters:
    /// - matchStr: 要匹配的字符串
    /// - Returns: 返回所有字符串范围
    @discardableResult
    func hw_exMatchStrRange(_ matchStr: String) -> [NSRange] {
        var allLocation = [Int]() //所有起点
        let matchStrLength = (matchStr as NSString).length  //currStr.characters.count 不能正确统计表情

        let arrayStr = self.components(separatedBy: matchStr)//self.componentsSeparatedByString(matchStr)
        var currLoc = 0
        arrayStr.forEach { currStr in
            currLoc += (currStr as NSString).length
            allLocation.append(currLoc)
            currLoc += matchStrLength
        }
        allLocation.removeLast()
        return allLocation.map { NSRange(location: $0, length: matchStrLength) } //可把这段放在循环体里面,同步处理,减少再次遍历的耗时
    }
}
  • 方法二(推荐)

extension String {
    /// 字符串的匹配范围 方法二(推荐)
    ///
    /// - Parameters:
    ///     - matchStr: 要匹配的字符串
    /// - Returns: 返回所有字符串范围
    @discardableResult
    func hw_exMatchStrRange(_ matchStr: String) -> [NSRange] {
        var selfStr = self as NSString
        var withStr = Array(repeating: "X", count: (matchStr as NSString).length).joined(separator: "") //辅助字符串
        if matchStr == withStr { withStr = withStr.lowercased() } //临时处理辅助字符串差错
        var allRange = [NSRange]()
        while selfStr.range(of: matchStr).location != NSNotFound {
            let range = selfStr.range(of: matchStr)
            allRange.append(NSRange(location: range.location,length: range.length))
            selfStr = selfStr.replacingCharacters(in: NSMakeRange(range.location, range.length), with: withStr) as NSString
        }
        return allRange
    }
}
  • componentsseparatedby和split的区别

在NSString中有两个分割字符串的方法,分别为components(separatedBy:)方法和components(separatedBy:)方法。
(1)components(separatedBy:)方法是将字符串根据指定的字符串参数进行分割,并将分别的内容转换为一个数组。其语法形式如下:
func components(separatedBy separator: String) -> [String]
其中,separator用来指定分割字符串。
【示例1-67】以下将使用components(separatedBy:)方法将字符串进行分割。
import Foundation
var a=NSString(string:"A,B,C,D,E,F")
print("分割前:(a)")
print("分割后:(a.components(separatedBy: ","))") //分割字符串
运行结果如下:
分割前:A,B,C,D,E,F
分割后:["A", "B", "C", "D", "E", "F"]
(2)components(separatedBy:)方法是将字符串根据指定的字符编码参数进行分割,并将分别的内容转换为一个数组。其语法形式如下:
func components(separatedBy separator: CharacterSet) -> [String]
其中,separator用来指定分割的字符集。
【示例1-68】以下将使用components(separatedBy:)方法将字符串进行分割。
import Foundation
var a=NSString(string:"ABCDEF")
print("分割前:(a)")
var b:CharacterSet=NSCharacterSet(charactersIn:"
") as CharacterSet
print("分割后:(a.components(separatedBy: b)))")
运行结果如下:
分割前:ABCDE*F
分割后:["A", "B", "C", "D", "E", "F"])


split() 方法用于把一个字符串分割成字符串数组。
语法stringObject.split(separator,howmany)
参数
描述
separator 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
howmany 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
返回值
一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。返回的数组中的字串不包括 separator 自身。
但是,如果 separator 是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。

你可能感兴趣的:(Swift 4.0-匹配字符串中对应字符所有NSRange)