C# 检查字符串是否有多个子字符串的正则表达式

C# 检查字符串是否有多个子字符串的正则表达式,c#,regex,C#,Regex,如果我需要检查一个字符串是否有特定的值,正则表达式会是什么样子 例如,它应该从以下字符串中提取持续时间量(timespan),但仅当源字符串包含所有持续时间、开始时间和比特率子字符串时 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 Durati

如果我需要检查一个字符串是否有特定的值,正则表达式会是什么样子

例如,它应该从以下字符串中提取持续时间量(timespan),但仅当源字符串包含所有
持续时间
开始时间
比特率
子字符串时

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

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

^(?=.*start:)(?=.*bitrate:).*Duration: ([\d.:]+)
时间戳可以在第一个捕获组中找到

看起来数据是从程序日志生成的,所以我假设间隔是规则的。我的正则表达式将忽略源字符串中
开始
比特率
持续时间
的顺序。如果要进行不区分大小写的匹配,请启用该标志

忽略排序将使正则表达式在长字符串上的速度变慢。我们的假设越多(特别是关于排序的假设),正则表达式就越好

解释

^
(?=.*start:)
(?=.*bitrate:)
.*Duration: ([\d.:]+)
^
锚定字符串的开头。出于性能原因,我添加了这个选项,因为如果正则表达式引擎彻底地回溯了所有情况,并且没有发现匹配项,那么就不需要检查匹配项

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

(?=.*比特率:)
,如上所述,检查
比特率:
是否在字符串的前面

*持续时间:([\d.:]+)
与实际持续时间匹配。我不在乎格式,因为我假设你得到的都是正确的,所以我只需要抓取最长的数字序列
\d


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

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

^(?=.*start:)(?=.*bitrate:).*Duration: ([\d.:]+)
时间戳可以在第一个捕获组中找到

看起来数据是从程序日志生成的,所以我假设间隔是规则的。我的正则表达式将忽略源字符串中
开始
比特率
持续时间
的顺序。如果要进行不区分大小写的匹配,请启用该标志

忽略排序将使正则表达式在长字符串上的速度变慢。我们的假设越多(特别是关于排序的假设),正则表达式就越好

解释

^
(?=.*start:)
(?=.*bitrate:)
.*Duration: ([\d.:]+)
^
锚定字符串的开头。出于性能原因,我添加了这个选项,因为如果正则表达式引擎彻底地回溯了所有情况,并且没有发现匹配项,那么就不需要检查匹配项

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

(?=.*比特率:)
,如上所述,检查
比特率:
是否在字符串的前面

*持续时间:([\d.:]+)
与实际持续时间匹配。我不在乎格式,因为我假设你得到的都是正确的,所以我只需要抓取最长的数字序列
\d


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

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

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

()
封装匹配的组(您要读取的
持续时间的值)。

您需要的是一个匹配整个字符串的表达式,并具有要提取的部分的捕获组,例如:

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

()
封装匹配的组(要读取的
持续时间的值)。

如果格式和顺序始终相同,则simplex regex可能如下所示:

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

如果格式和顺序始终相同,则simplex正则表达式可以如下所示:

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

顺序和格式是否始终相同?持续时间、开始时间、比特率?顺序和格式是否始终相同?持续时间,开始,比特率?你能解释一下正则表达式吗?对不起,但是。表达式有时很混乱..我只需要duration@Agzam:嗯,它在第一组。你能解释一下这个正则表达式吗?对不起,但是。表达式有时很混乱..我只需要duration@Agzam:嗯,它在第一组。