Поделиться через


Поиск с возвратом

Обновлен: Ноябрь 2007

Когда регулярные выражения имеют дополнительные или альтернативные шаблоны соответствий, обработчик соответствий регулярных выражений в некоторой точке обработки входной строки может начать поиск в нескольких областях, чтобы найти все возможные соответствия. Если нужное соответствие в первом направлении не найдено, обработчик должен вернуться на ту позицию во входной строке, где произошло разветвление, и попытаться найти альтернативное соответствие.

Например, рассмотрим регулярное выражение, созданное для поиска двух вариантов написания слова, обозначающего серый цвет: gray и grey. Знак чередования | используется для создания регулярного выражения gr(a|e)y, которое может соответствовать обоим произношениям. При обработке входной строки greengraygrowngrey, предположим, что обработчик сначала попытается найти gray. Он сравнивает первые два символа во входной строке, gr, затем происходит сбой на e в green. Обработчик возвращается к r (последнему совпадению перед альтернативным символом) и пытается найти grey. Обнаружив несоответствие на второй букве e, обработчик продолжит поиск и в конечном счете найдет два вставленных слова gray и grey.

В следующем примере кода показано, как создать это регулярное выражение и применить его к входной строке.

Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      ' Define strings: "gray" and "grey".
      Dim r As New Regex("gr(a|e)y") 
      Dim m As MatchCollection = r.Matches("greengraygrowngrey")
      Console.WriteLine("Number of groups found: {0}", m.Count)
   End Sub
End Module
' The example displays the following output:
'      Number of groups found: 2
using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
       // Define strings: "gray" and "grey".
       Regex r = new Regex("gr(a|e)y"); 
       MatchCollection m = r.Matches("greengraygrowngrey");
       Console.WriteLine("Number of groups found: {0}", m.Count); 
    }
}
// The example displays the following output:
//      Number of groups found: 2

См. также

Другие ресурсы

Регулярные выражения в .NET Framework