2014-09-01 1 views
1

정규 표현식을 사용하여 C#에서 더 긴 단어의 일부 alfanumeric 표현을 추출하려고합니다. 예를 들어 "FooNo12Bee"라는 단어가 있습니다. 나는 결과로 나에게 두 경기, "No12"와 "아니오"를 반환 다음 일반 표현식 코드, 사용C#에서 이상한 정규식 동작

alfaNumericWord = "FooNo12Bee"; 
Match m = Regex.Match(alfaNumericWord, @"(No|Num)\d{1,3}"); 

나는 paranthesis없이 대한 대안없이 다음 식을 사용하는 경우 "없음"이 없다 내가 기대하고있는 방법, 그것은 단지 "No12"를 반환 작동합니다

alfaNumericWord = "FooNo12Bee"; 
Match m = Regex.Match(alfaNumericWord, @"No\d{1,3}"); 

이 두 표현, 왜 "아니오"에 대한 중복 결과에 paranthesis 결과를 사용하여 차이점은 무엇입니까?

+1

[그룹] (http://www.regular-expressions.info/brackets.html) - 그렇지 않은 * 중복을 * 당신이 명시 적으로 그것을 캡처하도록 요청했습니다 – CodingIntrigue

답변

6

정규식의 괄호는 캡처 그룹입니다. 즉, 괄호 사이에있는 내용이 캡처되어 캡처 그룹으로 저장됩니다.

캡쳐 그룹을 원하지 않지만 대체 그룹을 필요로한다면 캡쳐되지 않은 그룹을 사용하십시오. 첫 번째 괄호 후 ?:을 넣어 : 당신이 어떤 이유로 정규식을 변경하지 않는 경우

Match m = Regex.Match(alfaNumericWord, @"(?:No|Num)\d{1,3}"); 

일반적으로, 당신은 단순히 따라서 단지 전체 경기를 얻을 경기에서 그룹 0을 검색 (수 캡처 그룹을 무시하십시오.); 귀하의 경우 m.Groups[0].Value을 사용하십시오.

마지막으로, 당신은 사용 노치하여 정규식의 효율성을 향상시킬 수

Match m = Regex.Match(alfaNumericWord, @"N(?:o|um)\d{1,3}"); 
+0

아아, 나는 paranthesis를 사용하여 하위 그룹을 포착하는 명시적인 작업이 있다는 것을 몰랐다. 나는 대체 단어를 포착하기 위해서만 사용했다. paranthesis를 사용하지 않고 다른 단어를 찾는 다른 방법이 있습니까? –

+0

@ UfukCanBiçici 당신은 더 긴 대안을 사용할 수 있습니다 :'No \ d {1,3} | Num \ d {1,3}'... 그러나 그것은 너무 반복적입니다. – Jerry

1

나는 그것을 어떻게 부르는 지 설명 할 수는 없지만, 주위에 괄호를 두는 것은 새로운 그룹을 만들기 때문에 설명 할 수 있습니다. 이곳은 함께 일반 식의 일부 그룹화 외에

here 설명된다 또한 번째 캡처 그룹을 생성 괄호. 괄호 안에 정규 표현식의 일부와 일치하는 문자열 부분을 저장합니다.

정규식 집합 (값)? Set 또는 SetValue와 일치합니다. 첫 번째 경우에는 첫 번째 캡처 그룹 만 비어 있습니다. 두 번째 경우 첫 번째 캡처 그룹이 값과 일치합니다.

1

괄호가 그룹을 생성하기 때문입니다. ?:과 같이 그룹을 삭제할 수 있습니다. Regex.Match(alfaNumericWord, @"(?:No|Num)\d{1,3}");