2010-08-09 173 views

回答

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

从的perldoc perlre:

默认情况下,量化的子模式是“贪婪”,也就是说,它将匹配 多次地(给定一个特定的起始位置),而 仍允许其余的模式匹配。

这就是为什么.*x将匹配高达x的最后一次出现。

7

最简单的方法是使用/([^x]*)$/

5

第一个答案是好的,但 谈“的东西,不包含”当... 我喜欢用“匹配”正则表达式它

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

在某些情况下非常有用

+0

+1确实非常有用 – 2010-08-09 10:53:28

+1

您不需要正则表达式中的前导'。* x'。 – runrig 2010-08-09 18:00:32

+0

这是正确的,谢谢,但这是为了说明“doeas不包含x的东西” – benzebuth 2010-08-10 07:48:24

1

正则表达式/([^x]+)$/#assuming x is not last element of the string.

2

最简单的方法不是正则表达式,而是一个简单的split()并获取最后一个元素。

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

真的值得创建一个临时数组吗? 'print(split/x /,$ string)[ - 1];'也可以。 – Zaid 2010-08-09 11:04:58

+0

取决于对吗?如果我想使用其他元素呢? – ghostdog74 2010-08-09 11:51:21

3

另一种方式来做到这一点。它不像单个正则表达式那么简单,但是如果您为速度进行优化,则此方法可能比使用正则表达式的任何方法都快,其中包括split

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

我很惊讶没有人提到的特殊变量,这样做,$':“$'”返回匹配的字符串之后的一切。 (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介绍 “$ {^预匹配}”, “$ {^ MATCH}” 和 “$ {^ POSTMATCH}”,这是等效 到“$ `“,$ &和”$'“,只不过它们只能保证是在与”/ p“ (保留)修饰符执行的成功匹配之后定义的 。使用这些变量不会导致全局性能损失,不像它们的标点符号char等价物,但是 在折衷时必须告诉perl何时使用它们。

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

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

我会虚心提交这条路线是在大多数情况下,最好的,最直接的 方法,因为它不要求你做特别的事情 与你的模式建设,以获取postmatch部分,并且 没有性能损失。

+1

除非您正在捕捉“x”的第一个出现,而不是最后一个。 – runrig 2010-08-09 18:03:28

+0

@runrig:哈哈,这样会让我的整篇论文脱轨:)事实上,在这种特殊情况下,'/ x([^ x] *)$ /'会更好......我太习惯于描述'$' ',其他人都忽略了。 – Ether 2010-08-09 21:41:16

+0

如果您在'''字符之前放置'\',则可以避免引号中间的代码样式。 – CyberSkull 2016-02-01 03:02:11

相关问题