과부하 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
대리인을 건설 중입니다.
람다 표현식이 약간 깔끔한 코드 인 IMHO를 제공하는 완벽한 경우입니다. – Mels
@Mels 아주 좋은 지적이지만,'m.Groups [1] .Value' 만 전체''ReadTerm'' 대신에''ReadTerm''에 전달하기를 원할 것입니다.'regex.Replace (input, match => ReadTerm (match)); Match'. 답변이 업데이트되었습니다. –
람다에 대한 구문조차 필요하지 않습니다. 함수가 하나의 매개 변수를 취하면 다음과 같이 할 수 있습니다 :'regex.Replace (input, ReadTerm);' – ErikE