這是一項正在進行的工作,但是這是我迄今爲止...
public extension String {
public var minRegexMatchLength: Int {
let pattern = (self as NSString).mutableCopy() as! NSMutableString
if let expr = try? NSRegularExpression(pattern: "((\\(.*?\\))|(\\[.*?\\])|.)[*?]", options: []) {
expr.replaceMatchesInString(pattern, options: [], range: NSMakeRange(0, (pattern as String).length), withTemplate: "")
}
if let expr = try? NSRegularExpression(pattern: "((\\(.*?\\))|(\\[.*?\\])|.)[+]", options: []) {
expr.replaceMatchesInString(pattern, options: [], range: NSMakeRange(0, (pattern as String).length), withTemplate: ".")
}
if let expr = try? NSRegularExpression(pattern: "(\\[bswBSW])", options: []) {
expr.replaceMatchesInString(pattern, options: [], range: NSMakeRange(0, (pattern as String).length), withTemplate: ".")
}
if let expr = try? NSRegularExpression(pattern: "\\(.*?\\)", options: []) {
var lengths = [Int]()
expr.enumerateMatchesInString(pattern as String, options: [], range: NSMakeRange(0, (pattern as String).length))
{ (result: NSTextCheckingResult?, _, _) -> Void in
if let result = result {
let substring = pattern.substringWithRange(NSMakeRange(result.range.location + 1, result.range.length - 2))
var length = substring.length
for word in substring.componentsSeparatedByString("|") {
if (word.length < length) {
length = word.length
}
}
lengths.append(length)
}
}
var match = expr.firstMatchInString(pattern as String, options: [], range: NSMakeRange(0, (pattern as String).length))
var i = 0
while match != nil && i < lengths.count {
if let range = match?.range {
pattern.replaceCharactersInRange(range, withString: "".stringByPaddingToLength(lengths[i], withString: ".", startingAtIndex: 0))
}
match = expr.firstMatchInString(pattern as String, options: [], range: NSMakeRange(0, (pattern as String).length))
i += 1
}
}
return pattern.length
}
}
提示是大加讚賞。是的,這需要很多理論,並簡單地將表達式縮減爲一個簡短的字符串並返回該長度 –