2

簡単な正規表現に関するいくつかの解決策の後:私は現在次のことを行う正規表現を持っています:

if(Regex.IsMatch(ffmpegOutputToParse, "x1080|x720"))
{
    return true;
}

 ffmpegOutputToParse = "Duration: 00:00:28.52, start: 8.000000, bitrate: 7361 kb/s
    Stream #0.0: Audio: wmav2, 44100 Hz, stereo, s16, 192 kb/s
    Stream #0.1: Video: vc1, yuv420p, 1280x720, 5942 kb/s, 29.97 tb(r)
At least one output file must be specified"

このコードは正常に機能します。このコードで実行したいのは、「x720」または「x1080」の値を正確に一致させるだけでなく、範囲が720〜1080の場合にtrueを返すことです。

どうもありがとう

4

4 に答える 4

4

すべてを正規表現で実現する必要はありません。正規表現を使っていくつかのことを行ったり、正規表現以外のコードで他のことを行ったりすることは問題ありません。

あなたの場合、次のようにします(これはPerlにありますが、アイデアを得ることができます):

if ( $ffmpegOutputToParse =~ /x(\d{3,4})/ ) { # Match an x followed by 3 or 4 digits
    $rate = $1; # $1 is the first capture group;
    $is_ok = ($rate >= 720 && $rate <= 1080);  # Is the rate between acceptable values?
    ....

正規表現は、数値を比較するためではなく、パターンを照合するためのものです。次のようなことができます

x(7[2-9][0-9]|[89][0-9][0-9]|10[0-7][0-9]|1080)

しかし、それが何をしているのか、読者にはあまり明確ではありません。また、許容レートを 720-1080 から 512-1400 に変更する場合はどうなりますか? 私のバージョンで 1 行を変更するか、@TimPietzcker のバージョンで正規表現全体を書き直します。

于 2012-12-18T15:17:08.047 に答える
3

その場合、これらすべての値のテキスト表現を綴る必要があります。

@"x(7[2-9][0-9]|[89][0-9][0-9]|10[0-7][0-9]|1080)\b"

説明:

x               # Match x
(               # Match either...
 7[2-9][0-9]    # 720-799
|               # or
 [89][0-9][0-9] # 800-999
|               # or
 10[0-7][0-9]   # 1000-1079
|               # or
 1080           # 1080
)               # End of alternation
\b              # Make sure the number ends here
于 2012-12-18T15:08:55.403 に答える
0

私は正規表現の第一人者にはほど遠いですが、これはうまくいくはずですが、誰かがもっと最適化されたものをもたらすかもしれません..

x(72\d)|(7[3-9]\d)|([89]\d\d)|(10[0-7]\d)|(1080)
于 2012-12-18T15:13:50.603 に答える
0

(\d+)x(\d+) のような正規表現を使用すると、ビデオの解像度をキャプチャできる場合があります。文字列を整数に変換してから、比較を行うことができます。正規表現は、機能させることができたとしても、実際には数値比較に適したツールではありません。

于 2012-12-18T15:36:50.433 に答える