2013-03-01 53 views
0

如何将正则表达式的样子,如果我需要检查,如果一个字符串具有一定的价值,检查是否字符串正则表达式具有多个子

例如,它应该提取从以下字符串时间量(时间跨度),但前提是源字符串拥有所有Durationstartbitrate子共

Duration: 00:04:19.39, start: 0.157967, bitrate: 15636 kb/s 

线这应该被忽略:

Duration: 00:04:19.39, bitrate: 15636 kb/s 
start: 0.157967, bitrate: 15636 kb/s 
Duration: 00:04:19.39, start: 0.157967 
+1

是顺序和格式总是相同的?持续时间,开始,比特率? – jurgenreza 2013-03-01 17:40:23

回答

2

既然你是做数据提取,我只是去与这个简单的正则表达式:

^(?=.*start:)(?=.*bitrate:).*Duration: ([\d.:]+) 

时间戳可以第一个捕获组中找到。

看起来数据是从程序日志生成的,所以我假设这个间距是规则的。我的正则表达式将忽略源字符串中start,bitrateDuration的排序。如果你想不区分大小写的匹配,然后打开标志。

忽略顺序会使长字符串的正则表达式变慢。我们有更多的假设(特别是关于排序),正则表达式越好。

说明

^ 
(?=.*start:) 
(?=.*bitrate:) 
.*Duration: ([\d.:]+) 

^锚字符串的开始。我为了性能原因添加了这个,因为如果正则表达式引擎已经彻底地回溯了所有的情况并且没有找到匹配,那么不需要检查匹配。

(?=.*start:)零宽度正向预测。它会尝试从字符串中的当前位置匹配.*start:,如果找到,则继续从停止的位置开始匹配,如果找不到则停止。它被称为零宽度,因为它实际上并不消耗字符串,而不是正则表达式的这一部分.*Duration: ([\d.:]+)

(?=.*bitrate:),与上面相同,检查bitrate:是否在字符串的前面。

.*Duration: ([\d.:]+)与实际持续时间相符。我不打扰格式,因为我假设你得到的是正确的,所以我只抓取最长的数字序列\d.:

消费字符的概念在字符串中有多个匹配项时非常重要。有时候,您需要在字符串之前检查它是否包含特定的序列,然后才能决定该操作。这种检查不应该消耗字符,因为当您没有完成当前位置的文本时,您不应该提前处理文本。如果您使用了文本,那么您可能在文本中从当前位置到字符串中前面的文本中丢失了一些匹配项。

+1

你能解释一下这个正则表达式吗?对不起,但注册。表情有时候很混乱。 – Agzam 2013-03-01 17:49:47

+0

我只需要持续时间的时间范围值 – Agzam 2013-03-01 17:54:53

+0

@Agzam:嗯,它在第一个捕获组。 – nhahtdh 2013-03-01 18:02:33

2

你需要的是整个字符串相匹配的表达,并具有捕获组,你要提取的部分,是这样的:

@"Duration: (\d{2}:\d{2}:\d{2}.\d{2}), start: \d+(.\d+)?, bitrate: \d+ kb/s" 

()包围你的匹配组(的Duration值你想阅读)。

+0

这对我有效 – Agzam 2013-03-01 18:17:34

0

如果格式和顺序总是相同的,单纯的正则表达式可能是这样的:

Duration: (.*), start: .*, bitrate: .* 
相关问题