2010-03-03 6 views
2

먼저 작은 배경.정규 표현식에서 쌍 문자 열기/닫기와 일치

((Foo.Bar.StartsWith ("A")) & & (Foo.Bar.EndsWith ("B")))

그리고 : 나는 다음과 유사 문자열을 I는 다음과 같이 이러한 포맷하기 위해 노력하고있어 :

((Foo.Any (Bar.StartsWith ("A"))) & & (Foo.Any (Bar.EndsWith ("B"))))

사이드 노트 : .Bar 뒤에 오는 파트는 .Bar == "AB"와 같이()를 포함하지 않을 수도 있습니다.

저는 Foo라는 두 그룹을 캡처하려고합니다. 그리고 Bar.StartsWith ("< A 또는 B >"). 나는 다음과 같은 패턴을 만들었지 만, 뒤에 오는 괄호를 버린다.

((Foo.Any (Bar.StartsWith ("A")) & & (푸 :
\((Foo\.)(.*?)\) 

그래서 대신 내가, 내가지고있어 무엇을 찾고 있어요 점점

. 이 괄호 짧은 모든 (Bar.EndsWith ("B")))

.

문제는 내가이 일에 닫는 괄호를 포함해야 e. *? 일치 IF 거기에 여는 괄호가 있습니다. 나는 이것을하는 방법을 알아 내지 못 했어, 아무도 몰라?

PS - 코드는 C# .NET이지만 해결책에 모호한 언어 관련 RegEx 관련 내용이 포함되어 있지 않으면 문제가되지 않습니다.

+1

대체 패턴은 무엇입니까? 대체 패턴의 끝에 대괄호를 추가하기 만하면됩니다. –

+0

@ar 대체 패턴은 Any()를 추가하기 만하기 때문에 "$ 1Any ($ 2)"가됩니다. 교체에 단지)를 추가하는 것만 큼 문제는 두 번째 일치 그룹에 괄호가 실제로 포함되어 있다고 보장 할 수 없다는 것입니다.) 그렇지 않으면 추가 된 괄호가 올바르지 않게됩니다. –

답변

4

정규 표현식을 사용해야하는 이유가 있습니까? "일치하는"쌍을 찾으려고하면 정규식이 잘 수행하지 않는 것 중 하나입니다.

정상적인 코드를 통해 정상적으로 처리됩니다. 검색을 수행하여 "(Foo."을 찾은 다음 후속 문자를 반복하는 루프를 만들어 통과 한 닫는 괄호의 개수를 나타내는 카운터를 유지합니다. (에 도달하면 증가하고 )에 도달하면 감소합니다. 닫는 괄호를 치면 카운터가 0에 있으면 캡처 할 문자열의 끝입니다. 그 시점에서 캡처를 중지하고 해당 문자열을 가져 와서 추가하려는 Any() 안에 넣습니다. 그런 다음 "(Foo."을 찾으십시오.

의미가 있습니까? 당신이 정말로 내가하는 말을 따르지 않는다면 아마 의사 코드를 쓸 수 있습니다. 물론 정규 표현식을 포기할 수있는 경우에만 유효한 옵션입니다.

+0

처음에는 언뜻보기에 빠르고 간단하게 해결할 수있는 정규 표현식을 사용했습니다. 나는 물건을 훨씬 쉽게 만들기 때문에 당신이 추천하는 방식대로하고 있습니다. 감사! –