[英]Perl s/../../ not working as expected
代码有点复杂,但是我简化了一点。 我知道我可以轻松做到这一点:
$svn_module s#.*/##;
然后拔出模块的末端。 但是,这里发生了一些奇怪的事情:
#! /usr/bin/env perl
use strict;
use warnings;
my $svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController";
print qq(DEBUG: svn_module = "$svn_module"\n);
$svn_module =~ s#^.*(branches/.+?/)|(trunk)/##;
print qq(DEBUG: svn_module = "$svn_module"\n);
打印:
DEBUG: svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController"
DEBUG: svn_module = "http://svn.vegicorp.net/svn/SessionController"
但是,我期望:
DEBUG: svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController"
DEBUG: svn_module = "SessionController"
为什么我的替换表达式删除了trunk/
,但没有删除字符串的其余部分,直到trunk/
呢?
顺便说一句,添加额外的括号集将有助于:
$svn_module =~ s#^.*((branches/.+?/)|(trunk))/##;
将工作。
顺便说一下,这是Perl 5.8.8。 这是一台服务器,几乎是我坚持使用的版本。
大概应该是这个
s#^.*(?:branches/.+?/|trunk)/##;
因为,相反,它是单个替换,其中^.*
不存在
第二轮交替(匹配的轮换)。
^ .*
( branches/ .+? / )
|
( trunk )
编辑:扩展了新的正则表达式解释
^ # Beginning of string anchor
.* # Optional match as many as possible non-newline character until ..
(?: # Start non-capture grouping
branches/ .+? / # 'branches' plus '/' plus 1 or more chars plus '/'
| trunk # Or, 'trunk'
) # End grouping
与您的原始正则表达式等效的是
^ .*
( branches/ .+? / )
|
^ .*
( trunk )
我想你自己回答了这个问题。 | 运算符的优先级最低,因此可以添加括号。
David,也许我在这里错过了一些东西,但是除了将所有内容替换为您想要的最后一部分之外,为什么不捕获最后一部分呢?
use strict;
use warnings;
my $svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController";
my ($end_module) = $svn_module =~ /([^\/]+)$/;
print $end_module;
输出:
SessionController
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.