Подтвердить что ты не робот

Как я могу сопоставить все, что есть после последнего появления некоторого char в регулярном выражении perl?

Например, верните часть строки, которая после последнего x в axxxghdfx445 (должна возвращать 445).

4b9b3361

Ответ 1

my($substr) = $string =~ /.*x(.*)/;

От perldoc perlre:

По умолчанию квантованный подшаблон является "жадным", то есть он будет соответствовать        столько раз, сколько возможно (учитывая конкретное начальное местоположение), в то время как        все еще позволяя остальной части шаблона соответствовать.

Вот почему .*x будет соответствовать последнему появлению x.

Ответ 2

Самый простой способ - использовать /([^x]*)$/

Ответ 3

первый ответ хороший, но когда речь идет о "чем-то, что не содержит"... Мне нравится использовать регулярное выражение, которое "соответствует" ему

my($substr) = $string =~ /.*x([^x]*)$/;

очень полезно в некотором случае

Ответ 4

Еще один способ сделать это. Это не так просто, как одно регулярное выражение, но если вы оптимизируете скорость, этот подход, вероятно, будет быстрее, чем что-либо, используя регулярное выражение, включая split.

my $s     = 'axxxghdfx445';
my $p     = rindex $s, 'x';
my $match = $p < 0 ? undef : substr($s, $p + 1);

Ответ 5

Я удивлен, что никто не упомянул специальную переменную, которая делает это, $': "$'" возвращает все после согласованной строки. (perldoc perlre)

my $str = 'axxxghdfx445';
$str =~ /x/;

# $' contains '445';
print $';

Однако есть стоимость (выделение мое):

ПРЕДУПРЕЖДЕНИЕ: как только Perl увидит, что вам нужен один из $&, "$ ", or "$'" anywhere in the program, it has to provide them for every pattern match. This may substantially slow your program. Perl uses the same mechanism to produce $1, $2, etc, so you also pay a price for each pattern that contains capturing parentheses. (To avoid this cost while retaining the grouping behaviour, use the extended regular expression "(?: ... )" instead.) But if you never use $&, "$" или "$ '", тогда шаблоны без фиксирующие круглые скобки не будут наказываться. Поэтому избегайте $&, "$ '" и "$`", если вы можете, но если вы не можете (и некоторые алгоритмы действительно оцените их), как только вы их использовали один раз, используйте их по своему усмотрению, потому что вы уже заплатили цену. По состоянию на 5.005, $& не так дорого, как другие два.

Но подождите, там еще! Вы получаете двух операторов по цене одного, действуйте БЕСПЛАТНО!

В качестве обходного пути для этой проблемы Perl 5.10.0 вводит "$ {^ PREMATCH}", "$ {^ MATCH}" и "$ {^ POSTMATCH}", которые эквивалентны до "$`", $& и "$", за исключением того, что они гарантированы только определенный после успешного совпадения, которое было выполнено с помощью "/p", (сохранить). Использование этих переменных не приводит к глобальным в отличие от их знаков препинания char, однако при компромиссе, который вы должны указать perl, когда хотите их использовать.

my $str = 'axxxghdfx445';
$str =~ /x/p;

# ${^POSTMATCH} contains '445';
print ${^POSTMATCH};

Я смиренно утверждаю, что этот маршрут является лучшим и самым прямым подход в большинстве случаев, поскольку он не требует, чтобы вы делали специальные вещи с вашей структурой рисунка, чтобы получить часть послематчевки, и там не является штрафом за производительность.

Ответ 6

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

$string="axxxghdfx445";
@s = split /x/ , $string;
print $s[-1];

Ответ 7

Регулярное выражение: /([^x]+)$/ #assuming x is not last element of the string.