Energy
education

сайт для тех, кто хочет изучать энергетику

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

Регулярное выражение это шаблон, который может быть сопоставлен с входным текстом. .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 используется для представления регулярное выражение.

Класс 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#.

Пример 1

Следующий пример на соответствие слов, которые начинаются с '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
    

Пример 2

Следующий пример на соответствие слов, которые начинаются с '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
    

Пример 3

Этот пример убирает лишние пробелы:

    
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