역참조는 일치하는 그룹을 표현식 자체의 다른 위치로 참조하는 것을 의미합니다. 예를 들어 HTML 태그를 일치시킬 때 <a>를 일치시키고 </a>를 찾으려면 일치하는 a를 인용해야 합니다. 역참조를 사용합니다.
구문
a. 번호가 지정된 그룹을 역참조하려면 구문은 number입니다
. b. 명명된 그룹을 역참조하려면 구문은 다음과 같습니다.
예
a. 쌍을 이루는 HTML 태그 일치
@"<(?<tag>[^ s>]+)[^>]*>.*</k<tag>>"
b. 두 개의 겹치는 문자를 일치시킵니다
. public static void Main()
{
문자열 s = "aabbc11asd";
정규식 reg = new Regex(@"(w)1");
MatchCollection 일치 = reg.Matches(s);
foreach(일치 중 m 일치)
Console.WriteLine(m.Value);
Console.ReadLine();
}
반환 결과는 aa bb 11
여러 그룹 구조를 따르는보조 일치 그룹
입니다. 괄호 안의 패턴은 일치 결과의 일부로 저장되지 않습니다.
1.
긍정문(?=)의 의미: 괄호 안의 패턴은 반드시 문의 오른쪽에 표시되지만 일치 항목의 일부로 표시되지는 않습니다.
public static void Main()
{
문자열 s = "C#.net,VB.net,PHP,Java,JScript.net";
Regex reg = new Regex(@"[w#]+(?=.net)",RegexOptions.Compiled);
MatchCollection mc = reg.Matches(s);
foreach(mc에서 m 일치)
Console.WriteLine(m.Value);
Console.ReadLine();
//C# VB JScript 출력
}
일치 엔진에는 일치하는 .net이 필요하지만 일치하는 결과에 .net을 넣지 않는 것을 볼 수 있습니다.
2. 부정 선언(?!)
의미: 대괄호 안의 패턴은 선언의 오른쪽에 나타나지 않아야 합니다
. 다음 예는 다른 HTML 태그가 포함된 경우에도 태그 쌍의 < a>모든 콘텐츠를 얻는 방법을 보여줍니다.
공개 정적 무효 Main()
{
string newsContent = @"url:<a href=""1.html""><img src=""1.gif"">test<span style=""color:red;"">Regex</span> </a>.";
Regex regEnd = new Regex(@"<s*a[^>]*>([^<]|<(?!/a))*<s*/as*>",RegexOptions.Multiline) ;
Console.WriteLine(regEnd.Match(newsContent).Value);
//결과: <a href="1.html"><img src="1.gif">test<span style="color:red;">Regex</span></a>
Console.ReadLine();
}
3.
역긍정 선언(?<=)의 의미: 괄호 안의 패턴은 선언의 왼쪽에 나타나야 하지만 일치 항목의 일부로 표시되어서는 안 됩니다
. 4. 역부정 선언(?<!)의 의미
: 대괄호 안의 패턴은 명령문 왼쪽에 나타나는
비역추적 일치 구문이
아니어야 합니다. : (?>)
의미: 이 그룹이 일치된 후에는 일치된 문자를 역추적을 통해 후속 표현식 일치에 사용할 수 없습니다. 하하, 이 문장만 읽어서는 확실히 이해가 안 가는데, 이해하려고 노력을 많이 했으니 예를 들어보겠습니다.
" www.csdn.net "은 @"w+.(.*).w+"와 일치할 수 있지만 @"w+.(?>.*).w+"와는 일치할 수 없습니다! 왜?
그 이유는 정규 매칭은 탐욕적이기 때문입니다. 매칭 시 최대한 많은 결과를 매칭시키게 됩니다. 따라서 위 예시의 두 정규식에 있는 .*는 이때 첫 번째 표현식은 csdn.net과 완전히 일치하게 됩니다. in 일치를 시작하면 .w+ 일치할 문자가 없음을 발견하므로 역추적을 수행합니다. 소위 역추적은 .* 일치 결과를 푸시백하고 푸시백의 나머지 문자를 사용하여 일치시킵니다. .w+ ,.w+가 성공적으로 일치할 때까지 전체 표현식은 성공적인 일치 결과를 반환합니다. 두 번째 표현식은 비역추적 일치를 사용하므로 .*가 일치된 후에는 역추적을 통해 .w+와 일치하는 것이 허용되지 않으므로 전체 표현식이 일치하지 않습니다.
역추적은 리소스 낭비이므로 정규 표현식을 성공적으로 일치시키기 위해 역추적을 하지 않도록 하세요. 위의 예와 같이 @"w+.([^.]+ 로 바꾸면 됩니다. .)+w+"+".