2011-09-01 4 views
4

표현식 ^(?<res>a).*(?<res>c)와 테스트 문자열 abc이 주어지면 예상 된 그룹 res이 발견 된 값을 연결하고 ac를 얻지 만 최신 변경 사항 인 c을 얻습니다..NET의 정규식 : 캡처 된 그룹에 중복 명명

정규 표현식 내에서 명명 된 그룹에 대한 concat를 지원하는 C#의 정규 표현식 클래스의 모든 방법은 무엇입니까?

Regex issue with named captured pairs

Regex issue with named captured pairs

Regex issue with named captured pairs

Regex issue with named captured pairs

관련 질문 Regex issue with named captured pairs 및 기회를 그것은 Perl/PCRE 중복 된 명명 된 쌍을 지원하지 않지만 여기에. NET 있어요 및 정규식 단일 일치하는 문자열의 다른 부분에서 발견 된 값을 모두 포함합니다 (즉, abbbbbcdef가 ac를 반환해야 함).

regex를 두 번 이상 호출하거나 결과 그룹을 코드에 조인하는 것은 이제는 용인 된 해결책이 아니며 정규 표현식에서 전체 작업을 수행하려고합니다.

답변

-1

현재 솔루션은 각각의 조건에 대해 오름차순으로 그룹 이름을 지정하는 것입니다 : ((?<group0>))|((?<group1>)(?<group0>))

, 발견 된 모든 그룹이 목록에 넣어 자신의 이름으로 분류되어, 일치 중 하나 group0,group1하거나 group0에서 최종 쿼리 문자열을 구축 한 후 (일치하는 조건에 따라 다름).

^(?wastebytes(condition)(chance1)|(chance2))

:

또 다른 트릭은 처음부터 일치하는 시작하는 필요가

3
var match = re.Match(s); 
var captures = match.Groups["res"].Captures.Cast<Capture>().Select(c => c.Value); 
var result = string.Concat(captures); 

Cast()이 필요하다.

4

고유하지 않은 그룹 이름의 목적은 단순히 문자열 부분을 캡처하는 데 더 많은 유연성을 제공하기위한 것입니다. 캡처 된 부분을 촬영하고 다르게 재 조립하는 것은 일치했다 당신이 정규식 후 을 할 무언가이다 - 일반적으로 Replace 방법 :

string s0 = @"abbbbbcdef"; 
string s1 = Regex.Replace(s0, @"^.*(a).*(c).*$", "$1$2"); 
Console.WriteLine(s1); 

출력 :

ac 

이 질문은 다른 사람을 생각 나게 I 사람들이 관심이없는 문자열의 부분을 "건너 뛰기"를 원했던 부분을 보았습니다. 즉, 일부는 소비하지만 다른 부분은 소비하지 않기 때문입니다. 내가 낯 익은 정규 표현식 중 하나에서 그렇게하는 방법은 없다.

관련 문제