Обратный поиск по регулярному выражению - PullRequest
3 голосов
/ 07 октября 2010

У меня есть строка, которая содержит "foo", а затем цифры.Я хочу напечатать число после последнего foo в строке.Мне сказали, что единственный способ сделать это - перевернуть саму строку.Это не очень элегантно, и я удивлен, что у Perl нет лучшего способа выполнить работу.Есть ли лучший способ сделать это, чем это?

#!/usr/bin/perl
# works, but is ugly!!!
$string = "foo1 foo3 foo5 bar foo911 baz";
$string = scalar reverse($string);
$string =~ m/(\d+)oof/;
print scalar reverse("$1");

Ответы [ 3 ]

14 голосов
/ 07 октября 2010

Как насчет:

$string =~ /.*foo(\d+)/;

Пояснение:

$string =~ /.*     # Match any character zero or more times, greedily.
            foo    # Match 'foo'
            (\d+)  # Match and capture one or more digits.
           /x;

Жадное совпадение с любым символом будет соответствовать первым символам "foo" в строке, и вы останетесь только с последним "foo".

Пример:

#!perl -w

use strict;
use 5.010;

my $string = "foo1 foo2 foo3";
$string =~ /.*foo(\d+)/;
say $1;

Выход:

% perl regex.pl
3
4 голосов
/ 07 октября 2010

Я знаю, что вы уже выбрали ответ, но я думал, что добавлю свои 0,02 доллара.

Почему бы не сопоставить глобальный шаблон контекста списка и не взять последний элемент:

#!/usr/bin/perl

use strict;
use warnings;

my $string = "foo1 foo2 foo3 bar";
my @result = $string =~ /foo(\d+)/g;

print pop(@result) . "\n";
3 голосов
/ 07 октября 2010

Вот еще одно решение, вдохновленное комментарием ysth (если это очень длинная строка и последний foo находится в начале, что приводит к медленному регулярному выражению): split строка в 'foo' и анализ последнего элемента длячисла:

my @results = split /foo/, $string;
my ($digits) = ($results[-1] =~ m/^(\d+)/);

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

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