Regex 正则表达式匹配一系列值

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,

在对一个简单的正则表达式进行了一些解决之后:我有一个正则表达式,它目前执行以下操作:

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


非常感谢

在这种情况下,您需要详细说明所有这些值的文本表示:

@"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

我离regex大师还差得远,但这应该行得通,尽管有人可能会带来更优化的东西

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

你不必用正则表达式让一切都发生。可以使用正则表达式执行某些操作,也可以使用非正则表达式代码执行其他操作

在您的例子中,这样做(这是用Perl编写的,但您可以理解):


但这对读者来说还不太清楚。此外,如果您决定将可接受费率从720-1080更改为512-1400,该怎么办?您可以在我的版本中更改一行,或者在@TimPietzcker的版本中重写整个正则表达式。

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

我完全同意。我的答案或多或少表明,正则表达式不是匹配数字范围的理想工具。提供这两种解决方案的公认答案。。。第一个是我所选择的,因为前面提到的简化逻辑。读者:请注意,这是一个聪明的解决方案,但不是最容易维护的。在另一个答案中,蒂姆表示同意,他说:“我的答案或多或少表明,正则表达式不是匹配数字范围的理想工具。”
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)