Objective-C / Swift正则表达式匹配多个行 [英] Objective-C/Swift regex matching across multliple lines

查看:152
本文介绍了Objective-C / Swift正则表达式匹配多个行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个最初在python中使用的正则表达式,用于从已删除的HTML页面中提取2个字符串: var \s + kaynaklar。*?url \\\ *:\ s * \ ([^ \ ] +)\ \s *,\s * data\s *:\s * '([^'] +)

I have a regular expression originally used in python to extract 2 strings from a scraped HTML page : var\s+kaynaklar.*?url\s*:\s*\"([^\"]+)\"\s*,\s*data\s*:\s*'([^']+)

这在Python中运行良好但在Objective-C / Swift中没有。

This works fine in Python but not in Objective-C/Swift.

这是我正在使用的Swift 2.0代码找到结果:

This is the Swift 2.0 code I'm using to find the results:

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的示例:

And this is an example of the JS being checked inside the HTML looks like :

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>")
    }
})


推荐答案

根据您的反馈,我发现您只需告诉正则表达式引擎匹配带有句点的换行符。

From your feedback, I see you just need to tell the regex engine to match a newline with a period.

使用 NSRegularExpressionOptions.DotMatchesLineSeparators 选项:


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




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

Allow . to match any character, including line separators.


Available in OS X v10.7 and later.

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

As a quicker-to-implement alternative, use an inline (?s) modifier at the beginning of the pattern:

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

请参阅正则表达式演示

这篇关于Objective-C / Swift正则表达式匹配多个行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆