一尘不染

跨多行的Objective-C / Swift正则表达式匹配

swift

我有一个最初用于python的正则表达式,用于从抓取的HTML页面提取2个字符串:
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>")
    }
})

阅读 301

收藏
2020-07-07

共1个答案

一尘不染

从您的反馈中,我看到您只需要告诉正则表达式引擎将换行符与句点匹配即可。

使用NSRegularExpressionOptions.DotMatchesLineSeparators选项:

允许.匹配任何字符,包括行分隔符。

在OS X v10.7和更高版本中可用。

作为快速实施的替代方法,(?s)在模式的开头使用内联修饰符:

let regexString = "(?s)var\\s+kaynaklar.*?url\\s*:\\s*\\\"([^\\\"]+)\\\"\\s*,\\s*data\\s*:\\s*'([^']+)"

请参阅regex演示

2020-07-07