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,该怎么办?您要么在我的版本中更改一行,要么在@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 回答