Что делают скобки в регулярном выражении Perl? - PullRequest
4 голосов
/ 13 марта 2010

Я пробовал несколько регулярных выражений в операторе подстановки:

$str =~ s/^0+(.)/$1/;

преобразует 0000 в 0 и 0001 в 1

$str =~ s/^0+./$1/;

преобразует 0000 в пустую строку, от 000100 до 00, от 0001100 до 100.

какая разница в скобках?

Ответы [ 3 ]

2 голосов
/ 13 марта 2010

Мне кажется, это немного неправильно - вам нужна (), чтобы определить, какой у вас матч.

http://perldoc.perl.org/perlre.html

Буферы захвата

Конструкция брекетинга (...) создает буферы захвата. Ссылаясь на текущее содержимое буфера позже на, в пределах того же шаблона, используйте \ 1 для первого, \ 2 для второго и скоро. Вне матча используйте «$» вместо "\". (Обозначение работает в определенных обстоятельствах за пределами матч. Смотрите предупреждение ниже о \ 1 против $ 1 для деталей.) Возвращаясь к другой части матча называется обратная ссылка.

Так что в основном вы можете использовать

if ($str =~ /^0+(.)/) { print "matched $1"; }

Если у вас есть несколько сгруппированных совпадений, они будут равны $ 1, $ 2, $ 3 ... и т. Д., Например,

if ($str =~ /(0*)(1*)/) { print "I've got $1 and $2"; }

2 голосов
/ 13 марта 2010

Если вы хотите получить значение в $ 1 или $ 2, вам нужно сгруппировать шаблон в регулярное выражение. Без группировка, если вы хотите получить значение, будет отображаться сообщение об ошибке, если вы используйте следующее утверждение.

use strict;
use warnings;

Во втором утверждении, если вы используете переменная $ 1 без группировки. Так в этот раз значение в 1 доллар будет пустой. Таким образом, он заменит подобранный значение в пустое.

0 голосов
/ 13 марта 2010

В случае первого выражения, $ 1 соответствует шаблону.

В случае второго выражения не будет переменной $ 1, потому что это не имеет

группировка.

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