#regex #perl
#регулярное выражение #perl
Вопрос:
Я использую следующее:
if ($content =~ /([0-9]{11})/) {
my $digits = $1;
}
чтобы извлечь 11 последовательных цифр из строки. Однако он захватывает первые 11 последовательных цифр. Как я могу заставить его извлекать последние 11 последовательных цифр, чтобы я получал 24555199361
из строки с hdjf95724555199361
?
Комментарии:
1. Начните свой шаблон с
.*
: любого символа (кроме последовательности перевода строки) 0 или более раз, жадно (по умолчанию).2. Спасибо @CasimiretHippolyte
$content =~ /.*([0-9]{11})/
сработало. Если вы хотите указать это в качестве ответа, я с радостью его приму.
Ответ №1:
/([0-9]{11})/
означает
/^.*?([0-9]{11})/s # Minimal lead that allows a match.
Вы получаете то, что хотите, делая .*
жадным.
/^.*([0-9]{11})/s # Maximal lead that allows a match.
Если цифры появляются в самом конце строки, вы также можете использовать следующее:
/([0-9]{11})z/
Комментарии:
1. Обратите внимание, что привязка не так полезна с a
.*
, если у вас нет чего-то еще, что вы не показали. Совпадение уже начинается с начала строки. tchrist несколько раз напоминал мне об этом во время программирования на Perl. 🙂2. @briandfoy, Повторите » Совпадение уже начинается с начала строки. » Нет, не совсем. Конечно, первая попытка будет в позиции 0, но она может вернуться и повторить попытку в позиции 1, затем в позиции 2, затем в позиции 3 и т.д. Без
^
этого неудачное совпадение может быть квадратичным.
Ответ №2:
Всякий раз, когда вы хотите сопоставить что-то в конце строки, используйте привязку к концу строки $
.
$content =~ m/(d{11})$/;
Если этот шаблон не является самым концом, но вы хотите сопоставить «последнее» вхождение этого шаблона, вы сначала сопоставите «всю строку» с /.*/
, а затем вернетесь к последнему появлению шаблона. /s
Флаг разрешает .
метасимволу соответствовать переводу строки.
$content =~ m/.*(d{11})/s;
Для получения дополнительной информации см. Руководство по Perl regexp.
Комментарии:
1. Re » Всякий раз, когда вы хотите сопоставить что-либо в конце строки, используйте привязку к концу строки
$
. «, Нет, используйтеz
. Это не то, что$
делает.2. Re »
m/.*(d{11})/s
«, Нет. Как показал предыдущий ответ, вам нужен ведущийA
(или^
, если / m не используется), чтобы избежать ненужного возврата при неудачном совпадении