2014-04-11 3 views
5

C#에서 실행되는 정규 표현식을 사용하여 문자열에서 모든 일치 항목을 찾는 방법은 무엇입니까?C# Regex가 문자열의 여러 단어와 일치합니다.

아래의 예제 문자열에서 모든 일치 항목을 찾고 싶습니다. 예 :

inputString: Hello (mail) byebye (time) how are you (mail) how are you (time) 

나는 예에서 (mail)(time)을 일치합니다. 괄호는 ()입니다.

이 문제를 해결하기 위해 다음 코드를 작성했습니다.

string testString = @"(mail)|(time)"; 

Regex regx = new Regex(Regex.Escape(testString), RegexOptions.IgnoreCase); 
List<string> mactches = regx.Matches(inputString).OfType<Match>().Select(m => m.Value).Distinct().ToList(); 

foreach (string match in mactches) 
{ 
    //Do something 
} 

논리 OR 조건에 사용되는 파이프 ( |)인가?

답변

6

효과적으로

@"\(mail\)\|\(time\)". 

이 따라서, 귀하의 정규식 리터럴 "(mail)|(time)"를 찾고에

@"(mail)|(time)" 

를 돌려, Regex.Escape(testString)이 파이프 문자를 탈출하는 것입니다 사용.

당신의 경기가 모두 괄호로 둘러싸인 단어로 간단 경우, 나는이 같은 정규식 구축 할 것입니다 :

List<string> words = new List<string> { "(mail)", "(time)", ... }; 
string  pattern = string.Join("|", words.Select(w => Regex.Escape(w))); 
Regex  regex = new Regex(pattern, RegexOptions.IgnoreCase); 
+0

완료 !!!! @FishBasketGordo – Nisho

3
이 테스트 문자열에 괄호를 탈출

:

string testString = @"\(mail\)|\(time\)"; 

Regex.Escape 제거를 :

Regex regx = new Regex(testString, RegexOptions.IgnoreCase); 

출력 ntheses) :

(mail) 
(time) 

귀하의 경우에는 작동하지 않는 이유 Regex.Escape이뿐만 아니라 | 문자를 탈출한다는 것입니다 :

는 (메타 문자의 최소 세트를 이스케이프 \, *, +, ?, |, {, [, (,), ^, $,., # 및 공백)을 \ 코드로 바꿔 넣습니다.

+0

와우 ... 올바른. 하지만 Escape를 사용하는 이유는 무엇입니까? 내가 예를 들어 단어 목록에서 동적으로 TestString에를 구축하고자하기 때문에 : (메일) (시간) 나는 내가 Regex.Escape을 useing을 피할 수 있다고 생각 (있음) (이). 기묘한! @Grant Winney – Nisho

+1

'|'문자도 이스케이프 처리되기 때문에 생각합니다. –

+1

@ Nisho, 꼭'Escape '를 사용하세요.'String.Join ("|", myListOfWords.Select (Regex.Escape))'와 같은 것입니다. – decPL

관련 문제