Регулярное выражение это шаблон, который может быть сопоставлен с входным текстом. .Net framework позволяет такое соответствие. Шаблон состоит из одного или более символов, операторов или конструкций.
Это в основном специальные символы или управляющие символы. Символ обратной косой черты (\) в регулярном выражении означает, что символ, следующий за ним либо специальный символ, либо его следует понимать буквально.
В следующей таблице перечислены управляющие символы:
Управляющие символы | Описание | Шаблон | Соответствия |
---|---|---|---|
\a | Соответствует знаку колокольчика, \u0007. | \a | "\u0007" в "Warning!" + '\u0007' |
\b | В классе символов соответствует знаку backspace, \u0008. | [\b]{3,} | "\b\b\b\b" в "\b\b\b\b" |
\t | Соответствует знаку табуляции, \u0009. | (\w+)\t | "Name\t", "Addr\t" в "Name\tAddr\t" |
\r | Соответствует знаку возврата каретки, \u000D. (\r не эквивалентен знаку начала новой строки, \n.) | \r\n(\w+) | "\r\nHello" в "\r\Hello\nWorld." |
\v | Соответствует знаку вертикальной табуляции, \u000B. | [\v]{2,} | "\v\v\v" в "\v\v\v" |
\f | Соответствует знаку перевода страницы, \u000C. | [\f]{2,} | "\f\f\f" в "\f\f\f" |
\n | Соответствует знаку новой строки, \u000A. | \r\n(\w+) | "\r\nHello" в "\r\Hello\nWorld." |
\e | Соответствует escape-знаку, \u001B. | \e | "\x001B" в "\x001B" |
\ nnn | Использует восьмеричное представление для указания символа (в nnn может быть до трех цифр). | \w\040\w | "a b", "c d" в "a bc d" |
\x nn | Использует шестнадцатеричное представление для указания символа (nn состоит ровно из двух цифр). | \w\x20\w | "a b", "c d" in "a bc d" |
\c X \c x | Соответствует управляющему символу ASCII, который задан как X или x, где X или x является буквой управляющего символа. | \cC | "\x0003" in "\x0003" (Ctrl-C) |
\u nnnn | Совпадение со знаком Юникода в шестнадцатеричном представлении (строго четыре цифры, представленные как nnnn). | \w\u0020\w | "a b", "c d" in "a bc d" |
\ | Если за этим знаком следует символ, не распознанный как escape-символ из этой и других таблиц данной темы, то соответствует в точности этому символу. Например, \* совпадает с \x2A. Это позволяет обработчику регулярных выражений распознавать языковые элементы (такие как * или ?) и символьные литералы (представленные как \* или \?). | \d+[\+-x\*]\d+\d+[\+-x\*\d+ | "2+2" and "3*9" in "(2+2) * 3*9" |
Класс символов соответствует какому-либо одному набору символов. Классы символов состоят из языковых элементов, приведенных в следующей таблице.
Класс знаков | Описание | Шаблон | Соответствия |
---|---|---|---|
[группа_символов] | Соответствует одному символу из группы_символов. По умолчанию при сопоставлении учитывается регистр. | [mn] | "m" в "mat" "m", "n" в "moon" |
[^ группа_символов] | Отрицание: соответствует одному символу, не входящему в группу_символов. По умолчанию символы в группе_символов зависят от регистра. | [^aei] | "v", "l" в "avail" |
[первый - последний] | Диапазон символов: соответствует одному символу в диапазоне от первого до последнего. | (\w+)\t | "Name\t", "Addr\t" в "Name\tAddr\t" |
. | Подстановочный знак: соответствует какому-либо одному знаку, кроме "\n". | a.e | "ave" в "have" "ate" в "mate" |
\p{ name } | Соответствует одному символу в общей категории Юникода или в именованном блоке, указанном в параметре имя name. | \p{Lu} | "C", "L" в "City Lights" |
\P{ name } | Соответствует одному символу, не входящему в общую категорию Юникода или в именованный блок, указанный в параметре имя name. | \P{Lu} | "i", "t", "y" в "City" |
\w | Соответствует любому алфавитно-цифровому знаку. | \w | "R", "o", "m" и "1" в "Room#1" |
\W | Соответствует любому символу, не являющемуся буквой. | \W | "#" в "Room#1" |
\s | Соответствует любому пробельному символу. | \w\s | "D " в "ID A1.3" |
\S | Соответствует любому знаку, не являющемуся пробелом. | \s\S | " _" в "int __ctr" |
\d | Соответствует любой десятичной цифре. | \d | "4" in "4 = IV" |
\D | Совпадение с любым символом, не являющимся десятичной цифрой. | \D | " ", "=", " ", "I", "V" в "4 = IV" |
Привязки, или атомарные утверждения нулевой ширины, приводят к успеху или сбою сопоставления, в зависимости от текущей позиции в строке, но не предписывают обработчику перемещаться по строке или обрабатывать символы. Метасимволы, приведенные в следующей таблице, являются привязками.
Утверждение | Описание | Шаблон | Соответствия |
---|---|---|---|
^ | Соответствие должно начинаться в начале строки. | ^\d{3} | "567" в "567-777-" |
$ | Соответствие должно обнаруживаться в конце строки или до символа \n в конце строки. | -\d{4}$ | "-2012" в "8-12-2012" |
\A | Соответствие должно обнаруживаться в начале строки. | \A\w{3} | "Code" в "Code-007-" |
\Z | Соответствие должно обнаруживаться в конце строки или до символа \n в конце строки. | -\d{3}\Z | "-007" в "Bond-901-007" |
\z | Соответствие должно обнаруживаться в конце строки. | -\d{3}\z | "-333" в "-901-333" |
\G | Соответствие должно обнаруживаться в той точке, где заканчивается предыдущее соответствие. | \\G\(\d\) | "(1)", "(3)", "(5)" в "(1)(3)(5)[7](9)" |
\b | Соответствие должно обнаруживаться на границе между символом \w (алфавитно-цифровым) и символом \W (не алфавитно-цифровым). | \w | "R", "o", "m" и "1" в "Room#1" |
\B | Соответствие не должно обнаруживаться на границе \b. | \Bend\w*\b | "ends", "ender" в "end sends endure lender" |
Конструкции группирования отображают части выражений регулярных выражений и обычно захватывают части строки входной строки. Конструкции группирования состоят из языковых элементов, приведенных в следующей таблице.
Конструкция группирования | Описание | Шаблон | Соответствия |
---|---|---|---|
(часть_выражения) | Выделяет соответствующую часть выражения и назначает ей порядковый номер, отсчитываемый от нуля. | (\w)\1 | "ee" в "deep" |
(?< имя > часть_выражения) | Выделяет соответствующую часть выражения в именованную группу. | (?< double>\w)\k< double> | "ee" в "deep" |
(?< имя1 - имя2 > часть_выражения) | Задает сбалансированное определение группы. | (((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$ | "((1-3)*(3-1))" в "3+2^((1-3)*(3-1))" |
(?: часть_выражения) | Определяет невыделяемую группу. | Write(?:Line)? | "WriteLine" в "Console.WriteLine()" |
(?imnsx-imnsx: часть_выражения) | Применяет или отключает заданные параметры в части_выражения. | A\d{2}(?i:\w+)\b | "A12xl", "A12XL" в "A12xl A12XL a12xl" |
(?=часть_выражения) | Утверждение положительного просмотра вперед нулевой ширины. | \w+(?=\.) | "is", "ran", и "out" в "He is. The dog ran. The sun is out." |
(?!часть_выражения) | Утверждение отрицательного просмотра вперед нулевой ширины. | \b(?!un)\w+\b | "sure", "used" в "unsure sure unity used" |
(?<=часть_выражения) | Утверждение положительного просмотра назад нулевой ширины. | (?< =19)\d{2}\b | "51", "03" в "1851 1999 1950 1905 2003" |
(?<!часть_выражения) | Утверждение отрицательного просмотра назад нулевой ширины. | (?< !19)\d{2}\b | "ends", "ender" в "end sends endure lender" |
(?>часть_выражения) | Часть выражения поиска без возврата (или "жадного" поиска). | [13579](?>A+B+) | "1ABB", "3ABB", и "5AB" в "1ABB 3ABBC 5AB 5AC" |
Квантор указывает количество вхождений предшествующего элемента (знака, группы или класса знаков), которое должно присутствовать во входной строке, чтобы было зафиксировано соответствие. Кванторы состоят из языковых элементов, приведенных в следующей таблице.
Квантификатор | Описание | Шаблон | Соответствия |
---|---|---|---|
* | Соответствует предыдущему элементу ноль или более раз. | \d*\.\d | ".0", "19.9", "219.9" |
+ | Соответствует предыдущему элементу один или более раз. | "be+" | "bee" in "been", "be" in "bent" |
? | Соответствует предыдущему элементу ноль или один раз. | "rai?n" | "ran", "rain" |
{ n } | Предыдущий элемент повторяется ровно n раз. | ",\d{3}" | ",043" in "1,043.6", ",876", ",543", and ",210" in "9,876,543,210" |
{ n ,} | Предыдущий элемент повторяется минимум n раз. | "\d{2,}" | "166", "29", "1930" |
{ n , m } | Предыдущий элемент повторяется минимум n раз, но не более, чем m раз. | "\d{3,5}" | "166", "17668" "19302" в "193024" |
*? | Предыдущий элемент не повторяется вообще или повторяется, но как можно меньшее число раз. | \d*?\.\d | ".0", "19.9", "219.9" |
+? | Предыдущий элемент повторяется один или несколько раз, но как можно меньшее число раз. | "be+?" | "be" в "been", "be" в "bent" |
?? | Предыдущий элемент не повторяется или повторяется один раз, но как можно меньшее число раз. | "rai??n" | "ran", "rain" |
{ n }? | Предыдущий элемент повторяется ровно n раз. | ",\d{3}?" | ",043" в "1,043.6", ",876", ",543", и ",210" в "9,876,543,210" |
{ n ,}? | Предыдущий элемент повторяется по крайней мере n раз, но как можно меньшее число раз. | "\d{2,}?" | "166", "29", "1930" |
{ n , m }? | Предыдущий элемент повторяется не меньше n и не больше m раз, но как можно меньшее число раз. | "\d{3,5}?" | "166", "17668" "193", "024" в "193024" |
Обратная ссылка позволяет впоследствии идентифицировать ранее найденную соответствующую часть выражения в том же регулярном выражении. В следующей таблице перечислены конструкции обратных ссылок, поддерживаемые регулярными выражениями платформы .NET Framework.
Конструкция обратных ссылок | Описание | Шаблон | Соответствия |
---|---|---|---|
\ number | Обратная ссылка. Соответствует значению нумерованной части выражения. | (\w)\1 | "ee" в "seek" |
\k< name > | Именованная обратная ссылка. Соответствует значению именованного выражения. | (?< char>\w)\k< char> | "ee" в "seek" |
Конструкции изменения модифицируют регулярное выражение, включая сопоставление по принципу "либо-либо". Такие конструкции состоят из языковых элементов, приведенных в следующей таблице.
Конструкция изменения | Описание | Шаблон | Соответствия |
---|---|---|---|
| | Соответствует любому элементу, разделенному вертикальной чертой (|). | th(e|is|at) | "the", "this" в "this is the day. " |
(?( выражение ) да | нет ) | Сопоставляется с частью да, если выражение соответствует; в противном случае сопоставляется с необязательной частью нет. выражение интерпретируется как утверждение нулевой ширины. | (?(A)A\d{2}\b|\b\d{3}\b) | "A10", "910" в "A10 C103 910" |
(?( имя ) да | нет ) | Сопоставляется с частью да, если названное имя захвата имеет соответствие; в противном случае сопоставляется с необязательной частью нет. | (?< quoted>")?(?(quoted).+?"|\S+\s) | Dogs.jpg, "Yiska playing.jpg" в "Dogs.jpg "Yiska playing.jpg"" |
Подстановки – это языковые элементы регулярных выражений, которые поддерживаются в шаблонах замены. Дополнительные сведения см. в разделе Подстановки. Приведенные в следующей таблице метасимволы являются атомарными утверждениями нулевой ширины.
Знак | Описание | Шаблон | Шаблон замены | Входная строка | Результирующая строка |
---|---|---|---|---|---|
$number | Замещает часть строки, соответствующую группе номер. | \b(\w+)(\s)(\w+)\b | $3$2$1 | "one two" | "two one" |
${name} | Замещает часть строки, соответствующую именованной группе имя. | \b(?< word1>\w+)(\s)(?< word2>\w+)\b | ${word2} ${word1} | "one two" | "two one" |
$$ | Подставляет литерал "$". | \b(\d+)\s?USD | $$$1 | "103 USD" | "$103" |
$& | Замещает копией полного соответствия. | (\$*(\d*(\.+\d+)?){1}) | **$& | "$1.30" | "**$1.30**" |
$` | Замещает весь текст входной строки до соответствия. | B+ | $` | "AABBCC" | "AAAACC" |
$' | Замещает весь текст входной строки после соответствия. | B+ | $' | "AABBCC" | "AACCCC" |
$+ | Замещает последнюю захваченную группу. | B+(C+) | $+ | "AABBCCDD" | AACCDD |
$_ | Замещает всю входную строку. | B+ | $_ | "AABBCC" | "AAAABBCCCC" |
Following are various miscellaneous constructs:
Конструкция | Определение | Пример |
---|---|---|
(?imnsx-imnsx) | Устанавливает или отключает такие параметры, как учет регистра в середине шаблона. | \bA(?i)b\w+\b matches "ABA", "Able" в "ABA Able Act" |
(?#примечание) | Встроенное примечание. Примечание заканчивается первой закрывающей скобкой. | \bA(?#Matches words starting with A)\w+\b |
# [до конца строки] | Комментарий режима X. Примечание начинается от знака # без обратной косой черты и продолжается до конца строки. | (?x)\bA\w+\b#Matches words starting with A |
Класс Regex используется для представления регулярное выражение.
Класс Regex имеет следующие часто используемые методы:
Номер | Описание метода |
---|---|
1 |
public bool IsMatch(
string input
)
Показывает находит ли регулярное выражение, указанное в конструкторе Regex, соответствие в указанной строке ввода. |
2 |
public bool IsMatch(
string input,
int startat
)
Показывает находит ли регулярное выражение, указанное в конструкторе Regex, соответствие в указанной строке ввода, начиная с указанной начальной позиции в строке. |
3 |
public static bool IsMatch(
string input,
string pattern
)
Показывает находит ли регулярное выражение, указанное в конструкторе Regex, соответствие в указанной строке ввода. |
4 |
public MatchCollection Matches(
string input
)
Ищет в указанной входной строке все вхождения регулярного выражения. |
5 |
public string Replace(
string input,
string replacement
)
В указанной входной строке заменяет все строки, соответствующие шаблону регулярного выражения, указанной строкой. |
6 |
public string[] Split(
string input
)
Разделяет входную строку в массив подстрок в позициях, определенных шаблоном регулярного выражения, указанным в конструкторе Regex. |
Полный список методов и свойств приведен в документации Microsoft по C#.
Следующий пример на соответствие слов, которые начинаются с 'S':
using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
class Program
{
private static void showMatch(string text, string expr)
{
Console.WriteLine("Выражение: " + expr);
MatchCollection mc = Regex.Matches(text, expr);
foreach (Match m in mc)
{
Console.WriteLine(m);
}
}
static void Main(string[] args)
{
string str = "A Thousand Splendid Suns";
Console.WriteLine("Соответствие слов, которые начинаются с 'S': ");
showMatch(str, @"\bS\S*");
Console.ReadKey();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Соответствие слов, которые начинаются с 'S':
Выражение: \bS\S*
Splendid
Suns
Следующий пример на соответствие слов, которые начинаются с 'm' и заканчиваются на 'e':
using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
class Program
{
private static void showMatch(string text, string expr)
{
Console.WriteLine("Выражение: " + expr);
MatchCollection mc = Regex.Matches(text, expr);
foreach (Match m in mc)
{
Console.WriteLine(m);
}
}
static void Main(string[] args)
{
string str = "make maze and manage to measure it";
Console.WriteLine("Соответствие слов, которые начинаются с 'm' и заканчиваются на 'e':");
showMatch(str, @"\bm\S*e\b");
Console.ReadKey();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Соответствие слов, которые начинаются с 'm' и заканчиваются на 'e':
Выражение: \bm\S*e\b
make
maze
manage
measure
Этот пример убирает лишние пробелы:
using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
class Program
{
static void Main(string[] args)
{
string input = "Hello World ";
string pattern = "\\s+";
string replacement = " ";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);
Console.WriteLine("Оригинальная строка: {0}", input);
Console.WriteLine("Строка после замены: {0}", result);
Console.ReadKey();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Оригинальная строка: Hello World
Строка после замены: Hello World