2010-08-16 2 views
0

Perl 스크립트를 C# 3.5 루틴으로 변환하려고합니다.Regex.split, 일치하는 패턴의 왼쪽을 읽는 방법

내가 가진 펄 코드는이 :

C#에서
if($work =~ /\<[0-9][0-9][0-9]\>/){ 
    $left  = $`; 
    $match  = $&; 
    $work  = $'; 
} 

는 다음 코드 작성 :

string[] sSplit = Regex.Split(work, @"\<[0-9][0-9][0-9]\>"); 
if sSplit.length is > 2 
{ 
    left = sSplit[0]; 
    match = sSplit[1]; 
    work = sSPlit[2]; 
} 

을 그러나 sSplit[1] 위의 나에게 부여되지 않은 일치하는 패턴하지만 내용 대신 일치하는 문자열의 오른쪽.

답변

4

Regex.Split은 필요한 것이 아닙니다. =~ /.../에 해당하는 것은 Regex.Match입니다.

그러나, Regex.Match 펄의 $` 또는 $'에는 해당이 없다, 그래서 당신은 해결 방법을 사용해야하지만, 나는 그것이 정당한 일이라고 생각 :

var m = Regex.Match(work, @"^(.*?)(\<[0-9][0-9][0-9]\>)(.*)$", RegexOptions.Singleline); 
if (m.Success) 
{ 
    left = m.Groups[0].Value; 
    match = m.Groups[1].Value; // perhaps with Convert.ToInt32()? 
    work = m.Groups[2].Value; 
} 

또는 당신이에 일치 인덱스 및 길이를 사용할 수 있습니다 정규 표현식을 시도 할 때

var m = Regex.Match(work, @"^\<[0-9][0-9][0-9]\>"); 
if (m.Success) 
{ 
    left = work.Substring(0, m.Index); 
    match = m.Value; // perhaps with Convert.ToInt32()? 
    work = work.Substring(m.Index + m.Length); 
} 
+0

당신이 중 하나를 싶지 않을 것이다 (*.?) : (. 금지 사항 $& 형태 변수없이) 펄은

당신은 그들 주위에 괄호를 넣어 펄 delimters를 캡처 단지 같은 방식으로 작동합니다 또는 (. *)? 일치하는 문자열이 반복되고 모든 일치 항목을 얻고 싶고 왼쪽과 오른쪽에있는 항목을 원한다면 어떻게 될지 궁금합니다.이 질문의 범위를 벗어나는 내용이지만 읽었을 때 조금 이상합니다. – Chris

+1

@Chris : 두 번째 것이'(. *?)'또는'(. *)'인지 여부는 이후의'$'때문에 차이가 없습니다. 첫 번째 것은 중요합니다. 첫 번째 일치를 얻을 수 있도록'(. *?)'입니다. '(. *) '를 사용하면 마지막을 얻을 수 있습니다. – Timwi

+0

여러분, 많은 도움을 많이 주셔서 감사합니다! – Desai

2

, 난 항상 RegexHero를 recomment, 당신의 .NET 정규 표현식을 시각화하는 온라인 도구입니다 물건을 얻을. 이 경우 Regex.Match를 사용하고 그룹을 사용하십시오. 그게 네가 원하는 걸 줄거야.

\<\>의 백 슬래시는 C#이나 Perl, btw에서 필요하지 않습니다.

또한 대체 표현식에서 사용되는 경우 $`, $&$'은 C#에 해당하는 것에 유의하십시오. 이것이 결국 필요한 경우 Regex.Replace에서만 이러한 "마술 변수"를 사용할 수 있습니다.

1

split은 일반적으로 에게 구두 기호를 번까지 묻습니다. 너무 끝에

my @parts = split /(<[0-9][0-9][0-9]>)/; # includes the delimiter 
my @parts = split /<[0-9][0-9][0-9]>/; # doesn't include the delimiter 
+0

s/verboten/권장하지 않음 / – ysth