正则表达式为'数字x'大于'数字y'

时间:2015-07-21 14:25:44

标签: regex

使用图像尺寸时,我需要一个正则表达式,它返回高度大于宽度的图像尺寸。 尺寸为(例如)300x200,300x100,300x400。在这种情况下,只有最后一个(300 * 400)匹配。

我尝试了一个只检查第一个数字的简化版本,如下所示:

/(\d)[0-9]+x[$1-9][0-9]+/

但它没有用。我怎么能这样做?

感谢, 丹

1 个答案:

答案 0 :(得分:1)

在一般情况下,您不能使用正则表达式来比较单个正则表达式匹配操作中捕获的数字。您需要先将捕获的值转换为数字然后进行比较,如果结果符合预期,则将找到的值放入结果数组/列表中。

如果您使用 .NET regex,您仍然可以使用纯正则表达式解决方案获得必要的匹配。这是 here 描述的 @Sebastian Schumann 稍微修改过的正则表达式:

\b(?:
  0+x0*[1-9]\d*
  |
  (?:(?>0*)(?<length>\d)+x(?>0*)(?<-length>\d)*(?(length)(?!))\d+
  |   
  (
   (?=(?>0*)(?<o>\d)+x(?>0*)(?<-o>\d)*(?(o)(?!))\b)
   (?>0*)
   (?<prefix>\d*)
   (?:(?<g0>0)|(?<g1>1)|(?<g2>2)|(?<g3>3)|(?<g4>4)|(?<g5>5)|(?<g6>6)|(?<g7>7)|(?<g8>8)|(?<g9>9))
   \d*
 x
   (?>0*)
   \k<prefix>
   (?(g0)[1-9]|(?(g1)[2-9]|(?(g2)[3-9]|(?(g3)[4-9]|(?(g4)[5-9]|(?(g5)[6-9]|(?(g6)[7-9]|(?(g7)[89]|(?(g8)9|(?!))))))))))
   \d*
  )
 )
)\b

参见regex demo。我删除了匹配 x=y 情况的部分(使用 x = 0)并用单词边界替换锚点以在更长的字符串中查找匹配项。

如果你会使用 Perl,你就可以使用 this modified solution 最初写的 @Ed Avis

#!/usr/bin/perl
use warnings;
use feature 'say';

$s = "1x2 22x10 1x23 23x23  300x200 300x100 300x400";
my @matches;
while ($s =~ /\b(\d+)x(\d+)\b(?(?{$1 >= $2})(*FAIL))/g) {
  push(@matches, $&);
}
say "@matches";
# 1x2 1x23 300x400

看到一个 online Perl demo。在这里,我用单词边界替换了锚点,此代码片段获取在某个字符串中找到的所有匹配项。此正则表达式匹配如下:

  • \b - 一个词边界
  • (\d+) - 第 1 组 ($1):一位或多位数字
  • x - x 字符
  • (\d+) - 第 2 组 ($2):一位或多位数字
  • \b - 一个词边界
  • (?(?{$1 >= $2})(*FAIL)) - 执行 Perl 代码的插入:如果 Group 1 值大于或等于 Group 2 值,则匹配失败((*FAIL) 动词返回 false,正在搜索下一个匹配项,它等于 (?!)).