2010-06-24 4 views
5

나는 심각한 프로젝트가 아닌 재미 있고 정규 표현식에 대해 좀 더 익숙해지기 위해 번역가를 쓰고 있습니다. 아래의 코드에서 나는 이걸로 어디에서 일할 수 있다고 생각하니? (cheezburger 누구?).Regex.Matches를 사용하여 일치하는 패턴 확인하기

정규식 목록을 키로 사용하고 사전 값이 대체 값 목록이 포함 된 List<string> 인 사전을 사용하고 있습니다. 이 방법으로 할 경우, 대용품이 무엇인지 알아 내기 위해 분명히 핵심이 무엇인지 알 필요가 있습니다. 어떤 패턴으로 경기를 시작했는지 어떻게 알 수 있습니까?

 var dictionary = new Dictionary<string, List<string>> 
     {      
      {"(?!e)ight", new List<string>(){"ite"}}, 
      {"(?!ues)tion", new List<string>(){"shun"}}, 
      {"(?:god|allah|buddah?|diety)", new List<string>(){"ceiling cat"}}, 
      .. 
     } 

     var regex = "(" + String.Join(")|(", dictionary.Keys.ToArray()) + ")"; 

     foreach (Match metamatch in Regex.Matches(input 
      , regex 
      , RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture)) 
     { 
      substitute = GetRandomReplacement(dictionary[ ????? ]); 
      input = input.Replace(metamatch.Value, substitute); 
     } 

나는 이것을 시도 할 수 있습니까? 아니면이 광기를 성취 할 수있는 더 좋은 방법이 있습니까?

+3

'(?!))'이것은''''와 동일하기 때문에 의미가 없습니다. 아마도 당신은 부정적인 lookbehind 싶어? '(? polygenelubricants

+0

... 그리고 Buddha (Buddah가 아니라). .. 그리고 천장 고양이는 무엇 이냐? –

+0

@ 팀 : 고양이가 천장 팬에서 흔들어 대고있는 바이러스 성 마케팅 캠페인에 대한 참고라고 생각합니다. –

답변

6

정규식에서 각 캡처 그룹의 이름을 지정한 다음 일치 항목의 각 명명 된 그룹 값을 쿼리 할 수 ​​있습니다. 이렇게하면 원하는 것을 할 수 있습니다. 아래의 정규 표현식을 사용하여 예를 들어

,

(?<Group1>(?!e))ight 

당신이 다음 그룹이 경기 결과에서 일치 추출 할 수 있습니다 : 제프 가장 강력한 방법은 말한다처럼라는 이름의 그룹을 사용

match.Groups["Group1"].Captures 
+1

고마워, 이것이 내가 필요로 한 것! – Andrew

+0

@Andrew : 도와 드리겠습니다. –

0

.

패턴으로 표현 된 숫자로 그룹에 액세스 할 수도 있습니다.

(first)|(second) 

은 당신이 사용 비 캡처 연산자를 포함하지 않는 이상 괄호가있는 경우 물론

match.Groups[1] // match group 2 -> second 

액세스 할 수 있습니다 :

((?:f|F)irst)|((?:s|S)econd) 

match.Groups[1].Value // also match group 2 -> second 
1

당신을 다른 문제가있다. 이 체크 아웃 :

string s = @"My weight is slight."; 
Regex r = new Regex(@"(?<!e)ight\b"); 
foreach (Match m in r.Matches(s)) 
{ 
    s = s.Replace(m.Value, "ite"); 
} 
Console.WriteLine(s); 

출력 : slight이 발견되면

My weite is slite.

String.Replace는 글로벌 기업이기 때문에 비록 weight이 정규식과 일치하지 않는, 어쨌든 변경됩니다. 당신은 매치, 검색 및 교체를 동시에 수행해야합니다. Regex.Replace(String, MatchEvaluator)하면 그렇게 할 수 있습니다.

관련 문제