给出一个数字x,我想知道是否有任何匹配x和x + 1以及x + 2的正则表达式。
谢谢,
答案 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在他/她的评论中指出的那样,正则表达式不是这个的工具。