从字符串中提取部分

时间:2013-01-25 19:41:07

标签: c# .net regex

有人可以解释一下如何编写正则表达式来从给定的字符串中提取“持续时间”和“时间”吗?

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;

2 个答案:

答案 0 :(得分:0)

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

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

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

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

  3. 同样,对于你的第二个例子,你可以写

    1. “匹配一系列由冒号分隔的四位两位数字(除了最后一位是点)”:@"\d{2}:\d{2}:\d{2}\.\d{2}"

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

    3. 这些中的任何一个是否真正满足您的需要,取决于您遇到的实际数据。例如,第一个正则表达式会在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
相关问题