如果我需要检查字符串是否具有某些值
,那么正则表达式会是什么样子例如,它应该从以下字符串中提取持续时间数量(时间跨度),但前提是源字符串完全包含所有Duration
,start
和bitrate
子字符串
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
答案 0 :(得分:2)
由于您正在进行数据提取,我将使用这个简单的正则表达式:
^(?=.*start:)(?=.*bitrate:).*Duration: ([\d.:]+)
时间戳可以在第一个捕获组中找到。
似乎数据是从程序日志生成的,所以我假设间距是规则的。我的正则表达式会忽略源字符串中start
,bitrate
和Duration
的排序。如果你想要不区分大小写的匹配,那么打开标志。
忽略排序会使长字符串上的正则表达式变慢。我们的假设越多(尤其是关于排序),正则表达式就越好。
<强>解释强>
^
(?=.*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: .*