Objective-C / Swift正则表达式匹配多个行 [英] Objective-C/Swift regex matching across multliple lines
问题描述
我有一个最初在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屋!