正则表达式匹配一系列值

时间:2012-12-18 15:06:46

标签: regex

在简单的RegEx上解决了一些问题之后:我有一块Regex,目前正在执行以下操作:

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 个答案:

答案 0 :(得分: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的版本中重写整个正则表达式。

答案 1 :(得分: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

答案 2 :(得分:0)

我远不是正则表达式大师,但这应该有用,虽然有人可能会带来更优化的东西..

x(72\d)|(7[3-9]\d)|([89]\d\d)|(10[0-7]\d)|(1080)

答案 3 :(得分:0)

像(\ d +)x(\ d +)这样的正则表达式可能会让您捕获视频分辨率。您可以将字符串转换为整数,然后进行比较。正则表达式并不是数字比较的正确工具,即使它可以工作。