1

代码有点复杂,但我简化了一点。我知道我可以轻松做到这一点:

$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。这是一个服务器,几乎是我坚持的版本。

4

3 回答 3

4

大概应该是这个

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 )
于 2013-11-04T20:39:45.087 回答
2

我想你自己回答了这个问题。该| 运算符的优先级最低,因此添加额外的括号是解决方案。

于 2013-11-04T20:42:22.763 回答
1

大卫,也许我在这里遗漏了一些东西,但与其将所有内容替换到你想要得到你想要的东西的最后一部分,为什么不只捕捉最后一部分呢?

use strict;
use warnings;

my $svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController";
my ($end_module) = $svn_module =~ /([^\/]+)$/;
print $end_module;

输出:

SessionController
于 2013-11-04T21:04:43.487 回答