Как вы сопоставить две строки в двух разных переменных с помощью регулярных выражений? - PullRequest
1 голос
/ 24 января 2011
$a='program';
$b='programming';
if ($b=~ /[$a]/){print "true";}

это не работает

спасибо всем, я был немного смущен

Ответы [ 5 ]

3 голосов
/ 24 января 2011

Регулярное выражение [] означает класс символов, который соответствует любому из символов, перечисленных внутри него.

Ваше регулярное выражение эквивалентно:

$b=~ /[program]/

, который возвращает true, так как символ p находится в $b.

Чтобы увидеть, происходит ли совпадение или нет, вы печатаете true, печать true ничего не показывает. Попробуйте напечатать что-нибудь еще.

Но если вы хотите увидеть, присутствует ли одна строка внутри другой, вы должны отбросить [..] как:

if ($b=~ /$a/) { print true';}

Если переменная $a содержала какой-либо метасимвол регулярного выражения, то указанное выше совпадение не сможет исправить это место между \Q и \E, так что любые метасимволы в регулярном выражении будут экранированы:

if ($b=~ /\Q$a\E/) { print true';}
3 голосов
/ 24 января 2011

Предполагая, что любая переменная может быть получена из внешнего ввода, цитируйте переменные внутри регулярного выражения:

if ($b=~ /\Q$a\E/){print true;}

Тогда вы не обожгетесь, когда искомый шаблон будет содержать «зарезервированные символы», как любой из -[]{}().

2 голосов
/ 24 января 2011

(кроме пропущенных точек с запятой :) Почему вы ставите $a в квадратных скобках? Это делает его списком возможных символов. Попробуйте:

$b =~ /\Q${a}\E/

Обновление

Чтобы ответить на ваши замечания относительно = и =~:

  • =~ является оператором сопоставления и указывает переменную, к которой вы применяете регулярное выражение ($b) в вашем примере выше. Если вы опустите =~, тогда Perl будет автоматически использовать подразумеваемый $_ =~.
  • Результатом регулярного выражения является массив, содержащий совпадения. Вы обычно назначаете это так массиву, как в ($match1, $match2) = $b =~ /.../;. С другой стороны, если вы присваиваете результат скаляру, то скаляру будет назначено количество элементов в этом массиве.

Итак, если вы напишите $b = /\Q$a\E/, вы получите $b = $_ =~ /\Q$a\E/.

1 голос
/ 24 января 2011
$a='program';
$b='programming';
if ( $b =~ /\Q$a\E/) {
    print "match found\n";
}
0 голосов
/ 25 января 2011

Если вы просто ищете, содержится ли одна строка в другой и вам не нужно использовать какие-либо классы символов, квантификаторы и т. Д., То на самом деле нет необходимости запускать механизм регулярных выражений для точного литерального соответствия. , Попробуйте вместо этого использовать index: #! / Usr / bin / env perl

#!/usr/bin/env perl

use strict;
use warnings;

my $target = 'program';
my $string = 'programming';
if (index($string, $target) > -1) {
    print "target is in string\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...