2013-07-19 4 views
1

와 패턴을 변환의 내가 이와 같은 텍스트를 가지고 있다고 가정 해 봅시다 :정규식 대체 : 사용자 정의 기능

[MyAppTerms.TermName1]. [MyAppTerms.TermName2]. 1- [MyAppTerms.TermNameX 2- ...

I가 ReadTerm는 장기 명을 수신하고,에 대한 용어는 텍스트를 반환 정적 함수이다 ReadTerm("MyAppTerms.Whatever")의 결과 [MyAppTerms.Whatever] 발생할 때마다 교체 할 현재 언어.

Regex.Replace을 사용하면 가능합니까? (대안을 환영합니다). 대체 그룹을 찾고 있지만 기능을 사용할 수 있는지 확실하지 않습니다.

답변

5

과부하 Regex.Replace(String, MatchEvaluator)을 사용하십시오.

static void Main() 
{ 
    string input = "[MyAppTerms.TermName1]. [MyAppTerms.TermName2]. 1- [MyAppTerms.TermNameX] 2"; 
    Regex regex = new Regex(@"\[MyAppTerms\.([^\]]+)\]"); 
    string output = regex.Replace(input, new MatchEvaluator(RegexReadTerm)); 

    Console.WriteLine(output); 
} 

static string RegexReadTerm(Match m) 
{ 
    // The term name is captured in the first group 
    return ReadTerm(m.Groups[1].Value); 
} 

패턴 \[MyAppTerms\.([^\]]+)\][MyAppTerms.XXX] 태그를 일치하고 캡처 그룹의 XXX을 캡처합니다. 이 그룹은 MatchEvaluator 대리인에서 검색되어 실제 ReadTerm 메서드로 전달됩니다.

는 (C# 3.0 이후) 람다 표현식도 좋습니다 : 여기

static void Main() 
{ 
    string input = "[MyAppTerms.TermName1]. [MyAppTerms.TermName2]. 1- [MyAppTerms.TermNameX] 2"; 
    Regex regex = new Regex(@"\[MyAppTerms\.([^\]]+)\]"); 
    string output = regex.Replace(input, m => ReadTerm(m.Groups[1].Value)); 

    Console.WriteLine(output); 
} 

, 당신은 바로 컴파일러을 담당하면서 (함께 코드의 논리적 연결 조각을 유지)를 사용하는 코드 내부 평가자를 정의 그 MatchEvaluator 대리인을 건설 중입니다.

+2

람다 표현식이 약간 깔끔한 코드 인 IMHO를 제공하는 완벽한 경우입니다. – Mels

+0

@Mels 아주 좋은 지적이지만,'m.Groups [1] .Value' 만 전체''ReadTerm'' 대신에''ReadTerm''에 전달하기를 원할 것입니다.'regex.Replace (input, match => ReadTerm (match)); Match'. 답변이 업데이트되었습니다. –

+0

람다에 대한 구문조차 필요하지 않습니다. 함수가 하나의 매개 변수를 취하면 다음과 같이 할 수 있습니다 :'regex.Replace (input, ReadTerm);' – ErikE