我有一个最初用于python的正则表达式,用于从抓取的HTML页面提取2个字符串: var\s+kaynaklar.*?url\s*:\s*\"([^\"]+)\"\s*,\s*data\s*:\s*'([^']+)
var\s+kaynaklar.*?url\s*:\s*\"([^\"]+)\"\s*,\s*data\s*:\s*'([^']+)
这在Python中可以正常工作,但在Objective-C / Swift中则不能。
这是我用来查找结果的Swift 2.0代码:
do { let regexString = "var\\s+kaynaklar.*?url\\s*:\\s*\\\"([^\\\"]+)\\\"\\s*,\\s*data\\s*:\\s*'([^']+)" let regex = try NSRegularExpression(pattern: regexString, options: []) let nsString = text as NSString let results = regex.matchesInString(text, options: [], range: NSMakeRange(0, nsString.length)) return results.map { nsString.substringWithRange($0.range)} } catch let error as NSError { print("invalid regex: \(error.localizedDescription)") return [] }
这是在HTML内部检查JS的示例,如下所示:
var kaynaklar = []; jQuery.ajax({ type:"POST", url:"/service/part", data:'id=31398', success:function(a){ if(a=="hata") { jQuery("#player").html("<br><br><font style='color:white;'>Video kaynağı silinmiş lütfen sol üstten Kaynak butonuna tıklayarak farklı bir kaynak deneyin.</font>") } else { for (var i = 1; i < 6; i++) { if(a["videolink"+i]) { kaynaklar.push({"file":a["videolink"+i], "label":a["videokalite"+i],"type":"mp4"}); } } video_loader(); } }, error:function(){ jQuery("#player").html("<br><br><font style='color:white;'>Video yüklenirken bir hata oluştu lütfen sayfayı yenileyip tekrar deneyin veya farklı bir kaynak deneyin.</font>") } })
从您的反馈中,我看到您只需要告诉正则表达式引擎将换行符与句点匹配即可。
使用NSRegularExpressionOptions.DotMatchesLineSeparators选项:
NSRegularExpressionOptions.DotMatchesLineSeparators
允许.匹配任何字符,包括行分隔符。 在OS X v10.7和更高版本中可用。
允许.匹配任何字符,包括行分隔符。
.
在OS X v10.7和更高版本中可用。
作为快速实施的替代方法,(?s)在模式的开头使用内联修饰符:
(?s)
let regexString = "(?s)var\\s+kaynaklar.*?url\\s*:\\s*\\\"([^\\\"]+)\\\"\\s*,\\s*data\\s*:\\s*'([^']+)"
请参阅regex演示。