#regex #perl
#регулярное выражение #perl
Вопрос:
Используя perl, я не могу выполнить простой поиск, чтобы увидеть, находится ли одно число внутри другого. В приведенном ниже примере не вводится оператор if.
my $a = "12345";
my $b = "123456789";
if($a=~ m/$b/g) #doesn't work
{
print "success";
}
Приведенное ниже также не работает.
my $a = "12345";
my $b = "123456789";
if($a =~ /$b/) #doesn't work
{
print "success";
}
Комментарии:
1. если вы хотите проверить, находится ли
$a
оно в$b
, используйте$b =~ m/$a/
(g
флаг не нужен)2. это немного неинтуитивно, но это сработало …. спасибо! Вместо этого я переключился на поиск по индексу.
3. это вряд ли неинтуитивно… предположим, вы не использовали переменную, это было бы
$b =~ m/12345/
… и для поиска и замены, это$b =~ s/12345/abc/
.. так что удаление заключаетсяvariable =~
в сопоставлении или поиске и замене по этой переменной4. Пожалуйста, избегайте использования специальных переменных
$a
и$b
.5. Или просто однобуквенные имена переменных в целом.
Ответ №1:
Чтобы проверить, находится ли $substr
в $string
, вы хотите:
if ($string =~ /Q$substrE/)
или
if (index($string, $substr) >= 0)
В вашем случае это означает
if ($b =~ /Q$aE/)
или
if (index($b, $a) >= 0)
Q..E
приводит к тому, что содержимое промежуточной переменной сопоставляется буквально, а не обрабатывается как шаблон регулярного выражения.
if (//g)
не имеет смысла, и его использование может привести к тонким и очень странным проблемам.
Ответ №2:
Я полагаю, что вы, возможно, перепутали свои переменные в инструкции. $ a = ~ m / $ b / g указывает, что $ b можно найти в $ a (чтобы быть истинным), а не $ a можно найти в $ b . Поскольку $ a меньше по длине, чем $ b, операторы завершаются ошибкой (поскольку 123456789 не может быть найден в 12345).
Я подозреваю, что вы хотите:
if ( $b =~ m/$a/g ) # or ( $b =~ /$a/ )
{
print "success";
}
Комментарии:
1.
if ( //g )
не имеет смысла, и вы не преобразовали$a
в шаблон, используяquotemeta
.
Ответ №3:
В регулярных выражениях есть символы, которые могут иметь разные значения. Вместо этого сделайте это:
if (index($b, $a) != -1) #works