有人可以解释一下如何编写正则表达式来从给定的字符串中提取“持续时间”和“时间”吗?
Duration: 00:21:38.97, start: 0.000000, bitrate: 2705 kb/s
从第一个字符串我想要提取持续时间"00:21:38.97"
部分。
size= 1547kB time=00:01:38.95 bitrate= 128.1kbits/s
从第二个字符串我想提取时间"00:01:38.95"
部分。
我试过
Regex.Match(theString, @"\:\s([^)]*)\,\s").Groups[1].Value;
答案 0 :(得分:0)
当您需要编写正则表达式时,您需要考虑描述您想要匹配的文本。
对于您的第一个示例,我想到了两种可能的描述:
“匹配一系列四个两位数字,以冒号分隔”。
那将是@"\d{2}:\d{2}:\d{2}:\d{2}"
或@"(?:\d{2}:){3}\d{2}"
。
匹配"Duration: "
之后的任何文字,直到(但不包括)下一个逗号。那将是@"(?<=Duration: )[^,]*"
。
同样,对于你的第二个例子,你可以写
“匹配一系列由冒号分隔的四位两位数字(除了最后一位是点)”:@"\d{2}:\d{2}:\d{2}\.\d{2}"
。
匹配"time="
之后的任何文本,直到(但不包括)下一个空格。那将是@"(?<=time=)\S*"
。
这些中的任何一个是否真正满足您的需要,取决于您遇到的实际数据。例如,第一个正则表达式会在1234:56:78:9012
中找到匹配(这里匹配34:56:78:90
,这可能不是您想要的)。第二个正则表达式会在Duration: 00:21:38.97; start: 0.000000; bitrate: 2705 kb/s
之类的字符串上失败,因为分隔符已更改。
所以你需要确切地知道你在寻找什么;编写正则表达式非常简单。
答案 1 :(得分:0)
这是一个可能的解决方案:
class Program
{
static void Main(string[] args)
{
Regex regex = new Regex(@"(((?<Hour>[0-9]{1,2})[.:](?=[0-9]{2}))?(?<Minute>[0-9]{1,2})[.:])(?<Second>[0-9]{2})[.:](?<Milisecond>[0-9]{2})");
var string1 = "Duration: 00:21:38.97, start: 0.000000, bitrate: 2705 kb/s";
var string2 = "size= 1547kB time=00:01:38.95 bitrate= 128.1kbits/s ";
foreach(var match in regex.Match(string1).Captures)
{
Console.WriteLine(match.ToString());
}
foreach (var match in regex.Match(string2).Captures)
{
Console.WriteLine(match.ToString());
}
Console.ReadKey();
}
}
输出:
00:21:38.97
00:01:38.95