2012-09-25 2 views
2

가 나는 아래의 문자열에서 데이터를 취득하는 정규 표현식을 사용하고, 내 정규 표현식에 문제로 실행 :. *이 정규식의 전체 (나머지) 문자열과 일치하지 않는 이유는 무엇입니까?

String sFeedback = Regex.Match(Message, @"\[Feedback\]\:(?<string>.*?)\r\n\r\t\n# DO NOT EDIT THIS MAIL BY HAND #").Groups[1].Value; 

이 작품 :

"# DO NOT EDIT THIS MAIL BY HAND #\r\n\r\n[Feedback]:hallo\r\n\r\n# DO NOT EDIT THIS MAIL BY HAND #\r\n\r\n" 

에게 지금까지 나는 작업을 얻었다 헤더가 변경된 경우를 제외하고는 정규 표현식을 [feedback]:에서 문자열 끝까지 읽으려고합니다. (문자, 아스키, 모든 것을 ..)

나는 시도 : 정규 표현식 위 \[Feedback]:(?<string>.*?)$

온라인 어떤 정규 표현식 빌더에서 작업을 수행하지만이 작동하지 않습니다 내 C# 코드에서와 빈 문자열을 반환합니다. 뭐가 문제 야?

+2

주어진 문자열에서 원하는 결과는 무엇입니까? –

+0

나는 [피드백]에서 모든 문자를 얻고 싶습니다 : ...... 문자열의 끝까지 숫자/문자/기호/다른 언어 일 수 있습니다. – Greezer

+0

@Benjol 그것은 가장 작은 순서 가장 긴 대신 작동합니다. 예를 들어 문자열 'aabaab'에서'. * b'는'aabaab'과 일치하지만'. *? b'는'aab'과 일치합니다. 이 경우에는 문자열/줄 마커의 끝 부분이 바로 따라 오므로 가장 짧고 긴 일치가 동일하므로 무의미합니다. – verdesmarald

답변

2

문제는 당신이 정규식을 컴파일 할 때 RegexOptions.Singleline를 사용하거나 (?s)를 사용하여 인라인하지 않는 .가 줄 바꿈과 일치하지 않는다는 것입니다 :

(?s)\[Feedback\]:(.*)$ 
+0

덕분에 싱글 라인 옵션 (? s)이 작동합니다. – Greezer

0

이스케이프 문자가 없습니다. 또한

, 당신이 당신의 C# 코드에서 이름으로 그룹을 참조하지 않기 때문에, 당신은 더 정규식이

\[Feedback\]:(.*)$ 
+1

이 경우 이스케이프 문자가 필요하지 않습니다. 컨텍스트를 통해 알 수 있듯이 ']'이며 .NET regex 엔진은이를 처리하는 방법을 알고 있습니다. –

+0

멋지다. 정말 흥미 롭다. C#에 대해 몰랐습니다! –

+0

대부분의 정규식 엔진은 올바르게 처리하지만 일부에는 단점이 있기 때문에 일반적으로 이스케이프를 사용하여 단순하게 유지합니다. 예를 들어, .NET에서'[] []'은 유효한 문자 클래스이지만 Java에서는'[] [] [] ''을 써야합니다. –

0

$에 정규식을 단순화 할 수는 의미

경기해야 문자열의 끝에서 또는 \n 또는 줄 끝에서 발생합니다.

. 의미 :

\n 제외한 모든 단일 문자와 일치합니다.

시도는이 간단한 정규식을 사용 :

\[Feedback\]:(?<string>.*) 
+0

'Multiline'을 사용하면'[Feedback] :'뒤에 전체 문자열을 얻을 수 없으며, 다음 줄 바꿈까지만 사용할 수 있습니다. –

+0

그게 내가 가지고있는 문제 중 하나였습니다 : P – Greezer

관련 문제