регулярное выражение для числа, число увеличивается на один и два - PullRequest
0 голосов
/ 09 февраля 2012

Дайте число x, интересно, есть ли какое-нибудь регулярное выражение, которое соответствует x и x + 1 и x + 2.

Спасибо,

Ответы [ 6 ]

4 голосов
/ 09 февраля 2012

Лучшим подходом, вероятно, было бы сделать что-то вроде:

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

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

Но если вы хотите, вы можете использовать интерполяцию непосредственно в регулярном выражении:

my $x = 3;

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

Вывод для обоих:

3
4
5

Лично я думаю, что последнее намного менее читабельно.

3 голосов
/ 09 февраля 2012

Строка содержит:

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 голосов
/ 09 февраля 2012

Вы можете использовать (??{...}):

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$/;
0 голосов
/ 09 февраля 2012

Учитывая вашу другую переменную - давайте назовем ее $y - почему бы просто не проверить, $y==$x, $y-$x==1 или $y-$x==2?

Как указал Готи в своем комментарии, регулярные выражения не являются инструментом для этого.

0 голосов
/ 09 февраля 2012

Сначала я подумал об использовании index примерно так:

index( $source, $x + 2 );

Но затем для $x = 1 он просто ищет '3' в любом месте строки, что соответствует 31, 23Таким образом, кажется, что вы можете использовать регулярное выражение, чтобы убедиться, что это изолированная строка цифр.

/(?<!\d)${\( $x + 2 )}(?!\d)/
0 голосов
/ 09 февраля 2012

Для X = 10, регулярное выражение должно быть \b(?:11|12)\b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...