正则表达式,用于检查字符串是否具有多个子字符串

时间:2013-03-01 17:37:15

标签: c# regex

如果我需要检查字符串是否具有某些值

,那么正则表达式会是什么样子

例如,它应该从以下字符串中提取持续时间数量(时间跨度),但前提是源字符串完全包含所有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

3 个答案:

答案 0 :(得分:2)

由于您正在进行数据提取,我将使用这个简单的正则表达式:

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

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

似乎数据是从程序日志生成的,所以我假设间距是规则的。我的正则表达式会忽略源字符串中startbitrateDuration的排序。如果你想要不区分大小写的匹配,那么打开标志。

忽略排序会使长字符串上的正则表达式变慢。我们的假设越多(尤其是关于排序),正则表达式就越好。

<强>解释

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

^锚定字符串的开头。我出于性能原因添加了这个,因为如果正则表达式引擎已经详尽地回溯了所有情况,并且没有找到匹配项,则无需检查匹配。

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

(?=.*bitrate:),与上面相同,检查字符串中是否有bitrate:

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

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

答案 1 :(得分:2)

你想要的是一个与整个字符串匹配的表达式,并且具有你想要提取的部分的捕获组,如:

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

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

答案 2 :(得分:0)

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

Duration: (.*), start: .*, bitrate: .*