反向正则表达式搜索

Cor*_*fco 3 regex perl

我有一个字符串,其中包含"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");
Run Code Online (Sandbox Code Playgroud)

Can*_*ice 14

怎么样:

$string =~ /.*foo(\d+)/;
Run Code Online (Sandbox Code Playgroud)

澄清:

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

贪婪的"任何角色"匹配将匹配字符串中的第一个"foo",并且您将只留下匹配最后一个"foo".

例:

#!perl -w

use strict;
use 5.010;

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

输出:

% perl regex.pl
3
Run Code Online (Sandbox Code Playgroud)

  • 在你的情况下,你需要做两个`reverse`s和一个正则表达式.在我的情况下,我需要做一个正则表达式.您认为哪个更快? (4认同)
  • @Corey:当面对更快或更容易阅读的东西时,除非你有一个非常令人信服的理由(比如手头有基准数字),否则更容易阅读.几乎总是,通过为程序员提供比计算机更高效的方式,可以节省更多时间. (4认同)
  • @CanSpice:哪个会更快就不那么简单.如果在字符串末尾附近可能有一个foo,那么你的正则表达式可能会获胜; 如果它是一个非常长的字符串并且最后一个foo接近开头,那么如果双反转获胜则不会让我感到惊讶. (3认同)
  • $ me = 1而$ var =〜/ foo(\ d*?)/ g; $ me = $ 1; #非贪婪的变异,只有最后发现foo幸存.注意/ g修饰符. (2认同)