2013-06-13 7 views
-3

나는 ascv/zxc/zxc-asd/zx.java과 같은 문자열을 가지고 있습니다. 이제 두 번째 문자열을 자르고 / 문자열을 자르고 ascv/zxc이라는 문자열 값을 얻길 원합니다.문자열에 일치하지 않는 패턴 일치하는 펄 패턴 일치

마찬가지로 특수 문자 유형 및 해당 레벨을 입력합니다. 입력에 따라 문자열을 잘라야합니다. 예 : 문자 첫 경기에서 -; 또는 세 번째 경기가 /

매우 도움이 되었습니까?

+2

는 SO 코드 작성 서비스 아니다. 왜 노력했는지, 왜 효과가 없는지 공유하고 싶습니까? [묻는 방법] (http://stackoverflow.com/questions/how-to-ask)을 참조하십시오. – chrsblck

+0

나는 시도했다 : - $ a = "ascv/zxc/zxc-asd/zx.java", ($ str1, $ str2) = split (/ \ //, $ a); 출력은 ascv/zxc가 아님 ascv, zxc – usercm

+1

이렇게하려면 여러 가지 방법이 있는데, 'split'이 가장 간단합니다. 당신의 코멘트 편집을 보았습니다 : 다시 결합하기 위해'join'을 사용하십시오. – cdarke

답변

0

방법에 대해 :

my $str = 'ascv/zxc/zxc-asd/zx.java'; 
$str =~ s#^([^/]+/[^/]+).*#$1#; 
say $str; 

출력 :

ascv/zxc 
+0

고마워요.하지만 일치해야하는 레벨까지 달라질 수 있습니다. 첫 번째 특수 문자 (/)와 일치하거나 4 번째와 일치 할 수 있습니다. argument.instance - 3 번째 "/"일치 전에 문자열을 자르고 5 번째 전에 문자열을 자릅니다. "/"의 일치 – usercm

1

이 당신을 도움이 될 것입니다.

use strict; 
use warnings; 
use 5.010; 

my $str = 'ascv/zxc/zxc-asd/zx.java'; 

say truncate_at($str, '/', 1); 
say truncate_at($str, '/', 2); 
say truncate_at($str, '/', 3); 
say truncate_at($str, '/', 4); 
say truncate_at($str, '-', 1); 

sub truncate_at { 

    my ($str, $sep, $n) = @_; 
    my @offsets; 

    push @offsets, $-[0] while $str =~ m|\Q$sep|g; 
    substr($str, $offsets[$n-1]) = '' if $n <= @offsets; 

    $str; 
} 

출력

ascv 
ascv/zxc 
ascv/zxc/zxc-asd 
ascv/zxc/zxc-asd/zx.java 
ascv/zxc/zxc