-3

Could someone please explain me how to write regular expressions to extract the "duration" and "time" from given strings?

Duration: 00:21:38.97, start: 0.000000, bitrate: 2705 kb/s

From the first string I want to extract duration "00:21:38.97" part.

size= 1547kB time=00:01:38.95 bitrate= 128.1kbits/s 

From the second string I want to extract time "00:01:38.95" part.

I've tried

Regex.Match(theString, @"\:\s([^)]*)\,\s").Groups[1].Value;
4

2 回答 2

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
于 2013-01-25T20:13:36.370 回答
0

当您需要编写正则表达式时,您需要考虑描述您要匹配的文本的内容。

对于您的第一个示例,我想到了两种可能的描述:

  1. “匹配一系列四个两位数,用冒号分隔”。那将是@"\d{2}:\d{2}:\d{2}:\d{2}"@"(?:\d{2}:){3}\d{2}"

  2. 匹配后面的任何文本,"Duration: "直到(但不包括)下一个逗号。那将是 @"(?<=Duration: )[^,]*"

同样,对于您的第二个示例,您可以编写

  1. “匹配一系列四个两位数,用冒号分隔(最后一个是点除外)” @"\d{2}:\d{2}:\d{2}\.\d{2}":。

  2. 匹配后面的任何文本,"time="直到(但不包括)下一个空格。那将是 @"(?<=time=)\S*"

这些中的任何一个是否真正做到了您需要它做的事情取决于您遇到的实际数据。例如,第一个正则表达式会在其中找到匹配项1234:56:78:9012(它会34:56:78:90在此处匹配,这可能不是您想要的)。第二个正则表达式会在字符串上失败,Duration: 00:21:38.97; start: 0.000000; bitrate: 2705 kb/s因为分隔符已更改。

所以你需要确切地知道你在寻找什么;那么,编写正则表达式非常简单。

于 2013-01-25T20:01:27.133 回答