【问题标题】:Regular expression for 'number x' greater than 'number y''number x' 大于 'number y' 的正则表达式
【发布时间】:2021-03-01 04:15:10
【问题描述】:

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

我尝试了一个简化版本,它只检查第一个数字是否更大,如下所示:

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

但它没有用。我该怎么做?

谢谢, 丹

【问题讨论】:

  • 不,正则表达式用于模式匹配和替换,而不是逻辑(即大于/小于)。您需要提取高度和宽度,然后使用您选择的语言比较两者。
  • 您只是在处理 100 和 200 之类的数字吗...289*810 呢?
  • 我需要全部匹配,但即使是只匹配第一个数字的简化版本也可以
  • @Mr.Llama 谢谢,不知道。把这个写成我会接受的答案。
  • @Dani,正则表达式的味道是什么?至少可以使用 .NET 正则表达式。

标签: regex


【解决方案1】:

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

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

\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。在这里,我用单词边界替换了锚点,这段代码 sn-p 获取在某个字符串中找到的所有匹配项。此正则表达式匹配如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2011-08-24
    • 2015-03-22
    • 2011-06-15
    相关资源
    最近更新 更多