Обратная ссылка относится к ссылке совпадающей группы на другие места в самом выражении. Например, при сопоставлении тегов HTML мы сопоставляем <a>, и нам нужно заключить совпадающее a в кавычки, чтобы найти </a>, на этот раз вам нужно. использовать обратную ссылку.
Синтаксис
a. Для обратной ссылки на пронумерованную группу используется синтаксис number
. b Для обратной ссылки на именованную группу используется синтаксис k<name>.
Пример
a. Сопоставление парных HTML-тегов
@"<(?<tag>[^] s>]+)[^>]*>.*</k<tag>>"
b. Сопоставить два перекрывающихся символа
public static void Main()
{
строка s = "aabbc11asd";
Regex reg = new Regex(@"(w)1");
MatchCollection match = reg.Matches(s);
foreach(Соответствие m в совпадениях)
Console.WriteLine(m.Value);
Консоль.ReadLine();
}
Возвращаемый результат — это
вспомогательная группа сопоставления
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 (Соответствует m в mc)
Console.WriteLine(m.Value);
Консоль.ReadLine();
//Вывод C# VB JScript
}
Вы можете видеть, что механизм сопоставления требует сопоставления .net, но не добавляет .net в результаты сопоставления.
2. Отрицательное объявление (?!)
означает: шаблон в скобках не должен появляться в правой части объявления
. В следующем примере показано, как получить < a>Все содержимое в паре тегов, даже если оно содержит другие теги HTML.
общественная статическая пустота Main()
{
string newsContent = @"url:<a href=""1.html""><img src=""1.gif"">test<span style=""color:red;"">Regex</span> </а>.";
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>
Консоль.ReadLine();
}
3.
Значение обратного положительного объявления (?<=): шаблон в скобках должен появляться в левой части объявления, но не как часть совпадения
. 4. Значение обратного отрицательного объявления (?<!)
: шаблон в скобках не должен быть синтаксисом
сопоставления без возврата,
появляющимся в левой части оператора: (?>)
Значение: после сопоставления этой группы совпавшие символы не могут использоваться для сопоставления последующих выражений посредством поиска с возвратом. Ха-ха, я определенно не пойму этого, просто прочитав это предложение. Я потратил много времени, пытаясь понять это, поэтому давайте проиллюстрируем это на примере:
" www.csdn.net " может соответствовать @"w+.(.*).w+", но не может соответствовать @"w+.(?>.*).w+"! Почему?
Причина в том, что регулярное сопоставление является жадным. При сопоставлении будет соответствовать как можно большему количеству результатов. Таким образом, .* в двух регулярных выражениях в приведенном выше примере будет полностью соответствовать csdn.net. На данный момент первое выражение — это. in Когда он начинает сопоставление, он обнаруживает, что в .w+ нет символов для сопоставления, поэтому он выполняет возврат. Так называемый возврат назад заключается в возврате назад результата сопоставления .*, а оставшиеся символы из возврата используются для сопоставления. .w+ ,пока .w+ не будет успешно сопоставлено, все выражение возвращает успешный результат сопоставления. Второе выражение использует сопоставление без возврата, поэтому после сопоставления .* не допускается сопоставление .w+ посредством поиска с возвратом, поэтому все выражение не соответствует.
Обратите внимание, что возврат — это пустая трата ресурсов, поэтому старайтесь избегать возврата для успешного сопоставления с регулярным выражением. Как и в приведенном выше примере, вы можете заменить его на @"w+.([^.]+ . .)+w+"+".