Метод System.Text.RegularExpressions.Regex.Match
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
Метод Match(String, Int32) возвращает первую подстроку, которая соответствует шаблону регулярного выражения, начиная с позиции символа или после нее startat
в входной строке. Шаблон регулярного выражения, который ищется с помощью метода Match(String, Int32), определяется вызовом одного из конструкторов класса Regex. Сведения о языковых элементах, используемых для создания шаблона регулярного выражения, см. в кратком справочнике по языку регулярных выражений.
Параметр startat
При необходимости можно указать начальную позицию в строке с помощью startat
параметра. Все совпадения, начиная с начала startat
строки, игнорируются. Если вы не указываете начальную позицию, поиск начинается с позиции по умолчанию, которая является левым концом input
при поиске слева направо и правым концом input
при поиске справа налево. Несмотря на то, что начинается с startat
, индекс любого возвращаемого совпадения считается от начала строки.
Хотя обработчик регулярных выражений не возвращает совпадения, начинающиеся до startat
, он не игнорирует строку до startat
. Это означает, что утверждения, такие как привязки или утверждения lookbehind , по-прежнему применяются к входным данным в целом. Например, следующий код содержит шаблон с утверждением lookbehind, которое выполнено, даже если оно выполняется до startat
индекса 5 во входной строке.
using System;
using System.Text.RegularExpressions;
namespace Examples
{
public class Example3
{
public static void Main()
{
string input = "Zip code: 98052";
var regex = new Regex(@"(?<=Zip code: )\d{5}");
Match match = regex.Match(input, 5);
if (match.Success)
Console.WriteLine($"Match found: {match.Value}");
}
}
}
// This code prints the following output:
// Match found: 98052
Подсказка
- Если шаблон начинается с привязки
^
, ноstartat
больше 0, совпадения никогда не будут найдены в поиске в одной строке, так как они ограничены тем, что должны начинаться с индекса 0 при помощи^
. -
Эта привязка
\G
выполненаstartat
. Из-за этого, если вы хотите ограничить совпадение так, чтобы оно начиналось точно с определенной позиции символа в строке, закрепите регулярное выражение с помощью\G
на его начале для шаблона, совпадающего слева направо. Это ограничивает совпадение, поэтому оно должно начинаться точно сstartat
(или, если требуется несколько совпадений, чтобы совпадения были смежными).
Поиск справа налево
Поиск справа налево, то есть, когда шаблон регулярного выражения строится с параметром RegexOptions.RightToLeft, ведет себя следующим образом:
- Сканирование движется в противоположном направлении и шаблон сопоставляется от заднего (справа) к переднему (слева).
- Начальная позиция по умолчанию — это правый конец входной строки.
- Если
startat
задано, проверка справа налево начинается с символа на позицииstartat
- 1 (неstartat
). - Если привязка указана в правом конце шаблона, это ограничивает (первое) совпадение так, чтобы оно заканчивалось точно на
startat
- 1.
Дополнительные сведения о поиске справа налево см. в разделе Режим справа налево.
Определить, найдено ли совпадение
Вы можете определить, найден ли шаблон регулярного выражения в входной строке, проверив значение свойства возвращаемого Match объекта Success . Если совпадение найдено, свойство возвращаемого Match объекта Value содержит подстроку из input
, которая соответствует шаблону регулярного выражения. Если совпадение не найдено, его значение равно String.Empty.
Первый или несколько совпадений
Этот метод возвращает первую подстроку, найденную на позиции символа startat
или после нее в input
, которая соответствует шаблону регулярного выражения. Последующие совпадения можно получить, многократно вызвав метод возвращаемого Match объекта Match.NextMatch . Вы также можете получить все совпадения одним вызовом метода Regex.Matches(String, Int32), вызвав этот метод.
Исключения по тайм-ауту
RegexMatchTimeoutException Исключение возникает, если время выполнения операции сопоставления превышает интервал времени ожидания, указанный конструкторомRegex.Regex(String, RegexOptions, TimeSpan). Если при вызове конструктора не задан интервал времени ожидания, исключение возникает, если операция превышает любое время ожидания, установленное для домена приложения, в котором Regex создается объект. Если время ожидания не определено в Regex вызове конструктора или в свойствах домена приложения, или если значение времени ожидания равно Regex.InfiniteMatchTimeout, исключение не будет выброшено.