Perl: как сопоставить последние n цифр строки с n последовательными цифрами или более?

#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 не используется), чтобы избежать ненужного возврата при неудачном совпадении