Что делает этот следующий код? - PullRequest
0 голосов
/ 02 октября 2010

Что делает следующее? Кто-нибудь может мне объяснить?

$data = "What is the STATUS of your mind right now?";

$data =~/.*/; print "$1,$2\n";

$data =~/(.*?)(u+).*/; print "$1, $2\n";

$data =~/(.?)(u+).*/; print "$1, $2\n";

$data =~/(\w+\s)+/; print "$1, $2\n";

Что такое $1 and $2? Как это получить его значение? и что это за регулярные выражения?

Заранее спасибо:)

Ответы [ 2 ]

4 голосов
/ 02 октября 2010

Пожалуйста, прочитайте perldoc perlretut , который ответит на все ваши вопросы.

Общая ссылка для регулярных выражений Perl: perldoc perlre , но сначала вы должны прочитать руководство, поскольку оно служит более приятным введением.

0 голосов
/ 09 июля 2013

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

$1 содержит часть строки, которая была найдена в группе скобок first . У $2 есть часть строки, которая была найдена в группе скобок second . Вы можете догадаться, что будет содержать $3.

Давайте посмотрим на ваш пример:

$data = "What is the STATUS of your mind right now?";
$data =~/.*/; print "$1,$2\n";

Здесь нет скобок, поэтому $ 1 и $ 2 ничего не содержат.

$data =~/(.*?)(u+).*/; print "$1, $2\n";

Здесь есть две группы скобок. Первый - (.*?), который не соответствует ни чему, ни чему-либо возможному (не жадным образом, но это другая тема). Второй - (u+), который соответствует одному или нескольким * "u" * s.

Первое (и единственное) "u" в $data находится в середине "you" , поэтому $1 соответствует каждому до первого "u" и $2 соответствует этому "u" .

$data =~/(.?)(u+).*/; print "$1, $2\n";

Теперь первая группа - (.?), которая соответствует одному отдельному символу или ничего. Затем (u+) снова соответствует одному или нескольким * "u" * s.

Так как в нашей строке есть только один "u" , первая группа будет одним единственным символом перед ним, то есть "o" , а вторая группа будет соответствовать фактический "у"

$data =~/(\w+\s)+/; print "$1, $2\n";

Наконец, первая группа соответствует (\w+\s)+, то есть одному или нескольким символам «слова», за которыми следует символ пробела. Символы «слово» - это любой буквенно-цифровой символ или знак подчеркивания. Второй группы нет, но есть символ + (один или несколько).

Так чему же он соответствует? Это странно, и я не уверен, что мое понимание на 100% точно. Так как вся соответствующая группа имеет +, она сожрет как можно большую часть строки и все равно будет соответствовать \w+\s. В этом случае он может игнорировать все до «правильного» * ​​1058 *, которому затем соответствует $1.

Тогда, поскольку он имеет +, он будет искать больше совпадений сразу после этого, но, поскольку "right" - самая правая найденная строка, он никогда не найдет другое совпадение группы .

Так что $1 "правильно", а $2 пусто.

Резюме:

Когда вы видите $ 1 и $ 2, вы должны искать соответствующие скобки группы в последнем регулярном выражении.

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