2013-11-04 5 views
1

코드는 다소 복잡한 코드입니다 만 조금 단순화했습니다. 나는 이것을 쉽게 할 수 있다는 것을 안다 :Perl s /../../ 예상대로 작동하지 않습니다.

$svn_module s#.*/##; 

그리고 모듈의 끝 부분 만 잡아 당기십시오. 나머지

DEBUG: svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController" 
DEBUG: svn_module = "SessionController" 

왜 대체 식 trunk/을 제거 않지만,하지 : 나는 기다리고 있었다, 그러나

DEBUG: svn_module = "http://svn.vegicorp.net/svn/trunk/SessionController" 
DEBUG: svn_module = "http://svn.vegicorp.net/svn/SessionController" 

을 :

#! /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); 

이 인쇄 :하지만 뭔가 이상한 일이 일어나고있다 최대 문자열 trunk/까지? 괄호의 추가 세트를 추가하는 방식으로

는 데 도움이 :

$svn_module =~ s#^.*((branches/.+?/)|(trunk))/##; 

가 작동합니다.

그건 그렇고, 이것은 펄 5.8.8입니다. 이 서버는 서버이며 꽤 많이 버금가는 버전입니다.

답변

2

입니다. | 연산자가 우선 순위가 가장 낮으므로 추가 괄호를 넣는 것이 솔루션입니다.

+0

네가 내 질문에 대답했는지 아닌지 잘 모르겠다. 분명히 추가 세트 나 괄호가 작동했습니다. 그러나 당신의 대답을 읽은 후에, 나는 이해한다고 생각합니다. 나는 기본적으로'^. * branches /.+?/' 또는'trunk'와 일치한다고 말했습니다. 내가 생각한 것처럼 전체 문자열을 처음부터 '트렁크'까지 일치시키는 것은 아닙니다. –

+0

@DavidW. correct – ysth

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) 
+0

내 혼란 내 '^ *'앵커과 관련이있다 생각한다. 나는 이것이 문자열의 처음부터 일치한다고 가정 할 것이지만 분명히 그렇지 않다. –

+0

'? :'은 그룹 대체를하지 않기 때문에 실제로 필요하지 않습니다.하지만 다 치지는 않을 것 같습니다. 진짜 질문은 왜 내 앵커가 작동하지 않았는가하는 것입니다. 무슨 일이 있었는지 나보다 우선 순위를 잘못 읽었 기 때문입니다. 실제로'^. * branches /.+?/' ** 또는 **'trunk' 중 어느 하나와 실제로 일치했습니다. –

+0

@ David W. -'(? :)'은 캡쳐되지 않은 그룹핑을 의미하는 확장입니다. 전체 경기 (대체)에서 교체를하고 있기 때문에 그룹에서 캡쳐하는 것은 정말로 필요하지 않습니다. 앵커가 효과가 없었던 이유에 대한 진정한 대답은 당신이 적용하기를 원하는 두 가지 대안에서 제외되었습니다.정규 표현식은 연산자 우선 순위의 언어가 아니라 구문 (즉, 메타 문자)과 같은 언어입니다. – sln

1

아마도 내가 여기에 뭔가를 놓치고 있지만, 마지막 부분까지 모든 것을 대체하는 대신 원하는 부분을 얻고 싶습니다. 왜 마지막 부분을 캡처하지 않을까요?

use strict; 
use warnings; 

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

출력 :.

SessionController 
+0

나는'trunk' 또는'branches /.*?/'를 가지고 내가 프로젝트를보고 있는지, 그리고 어떤 디렉토리 나 태그 안에 있는지 확인하고 싶다. 그렇지 않으면, 나는 당신이 언급 한 것을 할 수있었습니다. –

+0

@DavidW. - 아. 그렇다면'? ((: trunk | branches). +) /','s ###' 대신에 캡쳐를 적절히 조정하는 것이 어떻습니까? – Kenosis

관련 문제