正则表达式的数字,数字加1和2

时间:2012-02-08 20:12:07

标签: regex perl

给出一个数字x,我想知道是否有任何匹配x和x + 1以及x + 2的正则表达式。

谢谢,

6 个答案:

答案 0 :(得分:4)

最好的方法可能是做一些事情:

my $x = 3;
my $regex = join "|", $x, $x+1, $x+2;

for (0 .. 10) {
    print "$_\n" if /$regex/;
}

但是如果你愿意,可以直接在regexp中使用插值:

my $x = 3;

for (0 .. 10) {
    print "$_\n" if /$x|${\($x+1)}|${\($x+2)}/;
}

两者的输出:

3
4
5

我个人认为后者的可读性要低得多。

答案 1 :(得分:3)

字符串包含:

my $pat = join '|', $x, $x+1, $x+2;
$s =~ /(?<![0-9])(?:$pat)(?![0-9])/    # Assumes non-negative integers

完全匹配:

my $pat = join '|', $x, $x+1, $x+2;
$y =~ /^(?:$pat)\z/

$y == $x || $y == $x+1 || $y == $x+2   # Most straightfoward

$x <= $y && $y <= $x+2                 # Possibly clearest

完全匹配(更具异国情调):

grep $y == $x + $_, 0..2

$y ~~ [ map $x_+$_, 0..2 ]

答案 2 :(得分:2)

您可以使用(??{...})

use re qw'eval';

/^ (?: $x | (??{ $x+1 }) | (??{ $x+2 }) ) $/x;

我想说使用$"更有意义:

local $" #" # fix highlighting
  = '|';

/^@{[ $x, $x+1, $x+2 ]}$/;

/^@{[ $x .. $x+2 ]}$/;

my @match = ( $x, $x+1, $x+2 );
/^@match$/;

答案 3 :(得分:0)

对于X = 10,正则表达式应为\b(?:11|12)\b

答案 4 :(得分:0)

我首先考虑使用index,如此:

index( $source, $x + 2 );

但是,对于$x = 1,它只是在字符串中的任何位置查找'3',匹配31,23。因此,您可能希望使用正则表达式来确保它是一个孤立的数字串。

/(?<!\d)${\( $x + 2 )}(?!\d)/

答案 5 :(得分:0)

鉴于您的其他变量 - 让我们称之为$y - 为什么不检查$y==$x$y-$x==1$y-$x==2

正如ghoti在他/她的评论中指出的那样,正则表达式不是这个的工具。