我想从匹配正则表达式模式的字符串中提取子字符串。
问题是这段代码:("ytplayer.config = {(.*?)};").exec(responseStringC)
。它必须匹配但返回nil。
string.exec函数:
extension String {
func exec (str: String) -> Array<String> {
do {
let regex = try NSRegularExpression(pattern: self, options: [.CaseInsensitive,.IgnoreMetacharacters])
let nsstr = str as NSString
let all = NSRange(location: 0, length: nsstr.length)
var matches : Array<String> = Array<String>()
regex.enumerateMatchesInString(str, options: NSMatchingOptions(rawValue: 0), range: all) {
(result : NSTextCheckingResult?, _, _) in
let theResult = nsstr.substringWithRange(result!.range)
matches.append(theResult)
}
return matches
} catch {
print("error")
return Array<String>()
}
}
}
&#34; responseStringC&#34;变量是:
问题是返回零。任何线索?
答案 0 :(得分:1)
您的exec
代码包含.IgnoreMetacharacters
flag:
将整个模式视为文字字符串。
删除它,以便可以将模式视为正则表达式模式。
另外,一个好主意是在模式的开头使用DOTALL修饰符(?s)
。
另外,请记住,点匹配任何字符,将其转义为与文字点匹配。
至于模式,我建议
"(?s)ytplayer\\.config = \\{(.*?)\\};"
或者更快:
"(?s)ytplayer\\.config = \\{([^}]*(?:\\}(?!;)[^}]*)*)\\};"
请参阅regex demo