既然你是做数据提取,我只是去与这个简单的正则表达式:
^(?=.*start:)(?=.*bitrate:).*Duration: ([\d.:]+)
时间戳可以第一个捕获组中找到。
看起来数据是从程序日志生成的,所以我假设这个间距是规则的。我的正则表达式将忽略源字符串中start
,bitrate
和Duration
的排序。如果你想不区分大小写的匹配,然后打开标志。
忽略顺序会使长字符串的正则表达式变慢。我们有更多的假设(特别是关于排序),正则表达式越好。
说明
^
(?=.*start:)
(?=.*bitrate:)
.*Duration: ([\d.:]+)
^
锚字符串的开始。我为了性能原因添加了这个,因为如果正则表达式引擎已经彻底地回溯了所有的情况并且没有找到匹配,那么不需要检查匹配。
(?=.*start:)
零宽度正向预测。它会尝试从字符串中的当前位置匹配.*start:
,如果找到,则继续从停止的位置开始匹配,如果找不到则停止。它被称为零宽度,因为它实际上并不消耗字符串,而不是正则表达式的这一部分.*Duration: ([\d.:]+)
。
(?=.*bitrate:)
,与上面相同,检查bitrate:
是否在字符串的前面。
.*Duration: ([\d.:]+)
与实际持续时间相符。我不打扰格式,因为我假设你得到的是正确的,所以我只抓取最长的数字序列\d
,.
和:
。
消费字符的概念在字符串中有多个匹配项时非常重要。有时候,您需要在字符串之前检查它是否包含特定的序列,然后才能决定该操作。这种检查不应该消耗字符,因为当您没有完成当前位置的文本时,您不应该提前处理文本。如果您使用了文本,那么您可能在文本中从当前位置到字符串中前面的文本中丢失了一些匹配项。
是顺序和格式总是相同的?持续时间,开始,比特率? – jurgenreza 2013-03-01 17:40:23