当前位置: 首页 > 面试题库 >

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

乐钱青
2023-03-14
问题内容

我有一个最初用于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>")
    }
})

问题答案:

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

使用NSRegularExpressionOptions.DotMatchesLineSeparators选项:

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

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

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

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

请参阅regex演示。



 类似资料:
  • 问题内容: 我正在使用python和pexpect从某些cisco设备中收集一些信息,并且在RE上成功地提取了讨厌的小物件。恐怕我已经撞墙了。一些开关堆叠在一起,我已经在脚本中确定了这一点,并使用了一个单独的例程来解析数据。如果将交换机堆叠在一起,则会看到以下内容(从推杆输出中提取) 当我遇到此问题时,我需要提取4表中每个开关的编号和型号(sw可以忽略,但是可以有1到9个开关)这是多行事物使我如愿

  • 我想从与正则表达式模式匹配的字符串中提取子字符串。 所以我在寻找这样的东西: 这就是我所拥有的: 问题是,为我提供了一个数组,其中的类型为。 < code>NSRange与< code >范围不兼容 知道如何在没有太多代码行的情况下在 swift 中实现这个简单的事情吗?

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 问题内容: 我的程序可以接受具有\ n,\ r \ n或\ r换行符的数据(例如Unix,PC或Mac样式) 构造匹配任何编码的正则表达式的最佳方法是什么? 另外,我可以在输入上使用Universal_newline支持,但是现在我很想看看正则表达式是什么。 问题答案: 我想精确使用的正则表达式是。 当我不关心一致性或空行时,我使用,我想这会使我的程序快0.2%。

  • 问题内容: 我有一个看起来像这样的文件: 该文件包含以开头和结尾的块。请注意,()之间的行数可以不同。我想在第一行中打印所有带有字符串“ test”的块(例如此处的“ SF:/ home / developer / test / resources / …”)。对于此示例,我想要的输出将是: 我想在 Linux 环境中执行此操作。 我的第一个尝试是使用“ sed”命令执行此操作,但是经过一些研究,

  • 给定下面的字符串 [NeMo(PROD)]10.10.100.100(EFA-B-3)[博科FC-Switch]传感器:电源#1(SNMP自定义表)关闭(无此名称(SNMP错误#2)) 我尝试获取多个匹配项以提取以下值: 因为我是正则表达式的初学者,所以我试图定义一些“规则”: 提取第一个圆括号内的第一个值,例如PROD 提取第一个闭合方括号和第二个开口圆括号之间的值,例如10.10.100.10