-3

与えられた文字列から「期間」と「時間」を抽出する正規表現の書き方を教えてもらえますか?

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"2番目の文字列から時間部分を抽出します。

私はもう試した

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

2 に答える 2

0

正規表現を作成する必要がある場合は、一致させようとしているテキストを説明するものについて考える必要があります。

最初の例では、2つの考えられる説明が思い浮かびます。

  1. 「コロンで区切られた一連の4つの2桁の数字に一致します」。それは@"\d{2}:\d{2}:\d{2}:\d{2}"または@"(?:\d{2}:){3}\d{2}"です。

  2. "Duration: "次のコンマまで(ただし含まない)以降のテキストと一致します。それはです @"(?<=Duration: )[^,]*"

同様に、2番目の例では、次のように書くことができます。

  1. "コロンで区切られた一連の4つの2桁の数字に一致します(最後のドットであるものを除く)" @"\d{2}:\d{2}:\d{2}\.\d{2}":。

  2. "time="次の空白まで(ただし含まない)以降のテキストと一致します。それはです @"(?<=time=)\S*"

これらのいずれかが実際に必要なことを実行するかどうかは、遭遇する実際のデータによって異なります。たとえば、最初の正規表現はで一致を見つけます1234:56:78:901234:56:78:90ここで一致しますが、おそらくあなたが望むものではありません)。Duration: 00:21:38.97; start: 0.000000; bitrate: 2705 kb/sセパレータが変更されたため、2番目の正規表現はのような文字列で失敗します。

したがって、探しているものを正確に知る必要があります。したがって、正規表現の記述は非常に簡単です。

于 2013-01-25T20:01:27.133 に答える
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 に答える