2016-10-26 2 views
1

C#에서 Regex.Replace를 사용하고 있습니다. 대체 된 문자열에서 선택적 그룹 중 하나가 캡처 된 경우에만 문자열의 일부가 나오는 조건을 넣고 싶습니다. Flag 캡처 그룹 선택 것을Regex.Replace : 선택적 그룹 기반 조건부 대체

(?<Expiry>\d+[my])\s+(?<Flag>[a-z][A-Z])?\s*$) 

주 - 예를 들어,이 정규식이있다.

대체 문자열은

"Expiry is ${Expiry}. Flag is : ${Flag}" 

지금 내가 깃발 그룹이 캡처되는 경우 "Flag is : ${Flag}" 문자열은 결과에 표시 할 수 있습니다.

나는 다음과 같은 코드를 사용하고 있습니다 :

var regex = new 
Regex("(?<Expiry>\d+[my])\s+(?<Flag>[a-z][A-Z])?\s*$)", 
RegexOptions.IgnoreCase | RegexOptions.Compiled); 
string result = regex.Replace("10y", "Expiry is ${Expiry}. Flag is : ${Flag}"; 

결과는해야 Expiry is 10y에 의해.

string result = regex.Replace("10y abc", "Expiry is ${Expiry}. Flag is ${Flag}"); 

결과는 "만료는 10y입니다. 플래그는 : abc"입니다.

도움을 주시면 감사하겠습니다.

+0

현재 코드를 공유 할 수 있습니까? –

+0

관련 항목 : http://stackoverflow.com/questions/767869/how-to-regex-replace-match-group-item-with-method-result –

+0

잠시 시간을내어 편집인을 알아보십시오. 코드를 게시 할 때 사용해야하는 코드 서식 지정 명령 (Ctrl-K)이 있습니다. 그렇지 않으면 markdown은'*'(및 기타)를 해석하여 코드의 의미를 변경합니다. –

답변

2

특정 그룹이 일치 항목 (= 일치)에 참여했는지 여부에 따라 다른 대체 값을 사용할 수 있습니다.

var s = "1m aZ"; 
var pat = @"(?<Expiry>\d+[my])\s+(?<Flag>[a-z][A-Z])?\s*$"; 
var res = Regex.Replace(s, pat, m => m.Groups["Flag"].Success ? 
    string.Format("Flag is : {0}.", m.Groups["Flag"].Value) : 
    string.Format("Expiry is {0}.", m.Groups["Expiry"].Value)); 
Console.WriteLine(res); 

가 교체 string.Format("Flag is : {0}.", m.Groups["Flag"].Value)는 다른, 교체 만 유효 메시지를 포함 할 것이라고 online demo

Flag하면 그룹이 일치 참조 :

아래의 예를 참조하십시오.