English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Регулярные выражения Это модель соответствия вводимого текста.
.Net framework предоставляет регулярный выражающий движок, который позволяет выполнять такое соответствие.
Модель состоит из одного или нескольких символов, операторов и структур.
Ниже приведены символы, операторы и структуры, используемые для определения различных категорий регулярных выражений.
Escaping символов
Character class
定位点
分组构造
Ограничитель
Конструкция обратной ссылки
Резервная конструкция
Заменить
Конструктивные элементы
Знак обратной косой черты (\) в регулярных выражениях указывает на то, что за ним следует специальный символ, или символ должен быть интерпретирован в прямом смысле.
В таблице ниже перечислены escape-символы:
Escape-символы | Описание | Шаблон | Соответствие |
---|---|---|---|
\a | Соответствует символу报警 (bell) \u0007. | \a | "Warning!" + '\u0007' 中的 "\u0007" |
\b | В классе символов соответствует клавише backspace \u0008. | [\b]{3,} | "\b\b\b\b" 中的 "\b\b\b\b" |
\t | Соответствует символу табуляции \u0009. | (\w+)\t | "Name\tAddr\t" 中的 "Name\t" и "Addr\t" |
\r | Соответствует символу carriage return \u000D. (\r и символ новой строки \n не эквивалентны.). | \r\n(\w+) | "\r\nHello\nWorld." 中的 "\r\nHello" |
\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\nWorld." 中的 "\r\nHello" |
\e | Соответствует Escape-символу \u001B. | \e | "\x001B" 中的 "\x001B" |
\ nnn | Использование формы представления в восьмеричном формате для указания символа (nnn состоит из двух до трех цифр). | \w\040\w | "a bc d" 中的 "a b" и "c d" |
\x nn | Specifies a character using hexadecimal notation (nn consists of exactly two digits). | \w\x20\w | "a bc d" 中的 "a b" и "c d" |
\c X \c x | Matches control character X or x specified by X or x, where X or x is the letter of the control character. | \cC | "\x0003" 中的 "\x0003" (Ctrl-C) |
\u nnnn | Matches a Unicode character (represented by a four-digit number nnnn) using a hexadecimal notation. | \w\u0020\w | "a bc d" 中的 "a b" и "c d" |
\ | Matches the character that follows an unrecognized escape character. | \d+[\+-x\*]\d+\d+[\+-x\*\d+ | "(2+2) * 3*9" 中的 "2+2" и "3*9" |
Character class matches any one character in a set of characters.
Ниже приведен список классов символов:
Character class | Описание | Шаблон | Соответствие |
---|---|---|---|
[character_group] | Matches any single character in character_group. By default, the match is case-sensitive. | [mn] | "mat" 中的 "m","moon" 中的 "m" и "n" |
[^character_group] | Не: corresponds to any single character not in character_group. By default, the characters in character_group are case-sensitive. | [^aei] | "avail" 中的 "v" и "l" |
[ first - last ] | Character range: matches any single character within the range from first to last. | [b-d] | [b-d]irds может соответствовать Birds, Cirds, Dirds |
. | Допускает любое одиночное символ, за исключением \n. Чтобы соответствовать точке (.) в оригинальном тексте (либо ., либо \u002E), перед символом необходимо добавить обратный слеш (\.). | a.e | "have" 中的 "ave", "mate" 中的 "ate" |
\p{ name } | Соответствует name Соответствует любому единичному символу из指定的 Unicode общекатегорий или наименований блоков. | \p{Lu} | "City Lights" 中的 "C" 和 "L" |
\P{ name } | Соответствует не name Соответствует любому единичному символу из指定的 Unicode общекатегорий или наименований блоков. | \P{Lu} | "City" 中的 "i"、 "t" 和 "y" |
\w | Соответствует любому символу алфавита. | \w | "Room#1" 中的 "R"、 "o"、 "m" 和 "1" |
\W | сопоставлять любые символы, не являющиеся словами. | \W | "Room#1" 中的 "#" |
\s | 与任何空白字符匹配。 | \w\s | "ID A1.3" 中的 "D " |
\S | 与任何非空白字符匹配。 | \s\S | "int __ctr" 中的 " _" |
\d | 与任何十进制数字匹配。 | \d | "4 = IV" 中的 "4" |
\D | 匹配不是十进制数的任意字符。 | \D | "4 = IV" 中的 " "、 "="、 " "、 "I" 和 "V" |
定位点或原子零宽度断言会使匹配成功或失败,具体取决于字符串中的当前位置,但它们不会使引擎在字符串中前进或使用字符。
下表列出了定位点:
断言 | Описание | Шаблон | Соответствие |
---|---|---|---|
^ | 匹配必须从字符串或一行的开头开始。 | ^\d{3} | "567-777-" 中的 "567" |
$ | 匹配必须出现在字符串的末尾或出现在行或字符串末尾的 \n 之前。 | -\d{4}$ | "8-12-2012" 中的 "-2012" |
\A | 匹配必须出现在字符串的开头。 | \A\w{4} | "Code-007-" 中的 "Code" |
\Z | 匹配必须出现在字符串的末尾或出现在字符串末尾的 \n 之前。 | -\d{3}\Z | "Bond-901-007" 中的 "-007" |
\z | 匹配必须出现在字符串的末尾。 | -\d{3}\z | "-901-333" 中的 "-333" |
\G | 匹配必须出现在上一个匹配结束的地方。 | \G\(\d\) | "(1)(3)(5)[7](9)" 中的 "(1)"、 "(3)" 和 "(5)" |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。 | er\b | 匹配"never"中的"er",但不能匹配"verb"中的"er"。 |
\B | 匹配非单词边界。 | er\B | 匹配"verb"中的"er",但不能匹配"never"中的"er"。 |
分组构造描述了正则表达式的子表达式,通常用于捕获输入字符串的子字符串。
下表列出了分组构造:
分组构造 | Описание | Шаблон | Соответствие |
---|---|---|---|
( subexpression ) | 捕获匹配的子表达式并将其分配到一个从零开始的序号中。 | (\w)\1 | "deep" 中的 "ee" |
(?< name >subexpression) | 将匹配的子表达式捕获到一个命名组中。 | (?< double>\w)\k< double> | "deep" 中的 "ee" |
(?< name1 -name2 >подвыражение) | Определение группы, определяющей баланс. | (((?'Open'(\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$ | В "3+2^((1-3)*(3-1))" совпадает "((1-3)*(3-1))" |
(?: подвыражение) | Определение группы, не предназначенной для захвата. | Write(?:Line)? | В "Console.WriteLine()" совпадает "WriteLine" |
(?imnsx-imnsx:подвыражение) | Применение или отключение подвыражение Определенные опции. | A\d{2}(?i:\w+)\b | В "A12xl A12XL a12xl" совпадают "A12xl" и "A12XL" |
(?= подвыражение) | Нулевая ширина прогнозное утверждение. | \w+(?=\.) | В "He is. The dog ran. The sun is out." совпадают "is", "ran" и "out" |
(?! подвыражение) | Нулевая ширина негативное прогнозное утверждение. | \b(?!un)\w+\b | В "unsure sure unity used" совпадают "sure" и "used" |
(?<=подвыражение) | Нулевая ширина обратное прогностическое утверждение. | (?A+B+) | В "1ABB 3ABBC 5AB 5AC" совпадают "1ABB", "3ABB" и "5AB" |
using System; using System.Text.RegularExpressions; public class Example { public static void Main() { string input = "1851 1999 1950 1905 2003"; string pattern = @"(?<=19)\d{2}\b"; foreach (Match match in Regex.Matches(input, pattern)) Console.WriteLine(match.Value); } }
Ограничитель определяет, сколько примеров предыдущего элемента (будь то символ, группа или класс символов) должно существовать в вводимой строке, чтобы出现了匹配. Ограничители включают языковые элементы, указанные в таблице.
В таблице ниже приведены ограничители:
Ограничитель | Описание | Шаблон | Соответствие |
---|---|---|---|
* | Совпадение с предыдущим элементом ноль или несколько раз. | \d*\.\d | ".0", "19.9", "219.9" |
+ | Совпадение с предыдущим элементом один или несколько раз. | "be+" | В "been" указан "bee", в "bent" указан "be" |
? | Соответствие предыдущему элементу нулевое или одно. | "rai?n" | "ran", "rain" |
{ n } | Соответствие предыдущему элементу точно n раз. | ",\d{3}" | В "1,043.6" указаны ",043", в "9,876,543,210" указаны ",876", ",543" и ",210" |
{ n ,} | Соответствие предыдущему элементу не менее n раз. | "\d{2,}" | "166", "29", "1930" |
{ n , m } | Соответствие предыдущему элементу не менее n раз, но не более m раз. | "\d{3,5}" | "166", "17668", В "193024" указаны "19302" |
*? | Соответствие предыдущему элементу нулевое или несколько раз, но с минимальным количеством. | \d*?\.\d | ".0", "19.9", "219.9" |
+? | Соответствие предыдущему элементу один или несколько раз, но с минимальным количеством. | "be+?" | В "been" указан "be", в "bent" указан "be" |
?? | Соответствие предыдущему элементу нулевое или одно, но с минимальным количеством. | "rai??n" | "ran", "rain" |
{ n }? | Соответствие начального элемента точно n раз. | ",\d{3}?" | В "1,043.6" указаны ",043", в "9,876,543,210" указаны ",876", ",543" и ",210" |
{ n ,}? | Соответствие предыдущему элементу не менее n раз, но с минимальным количеством. | "\d{2,}?" | "166", "29" и "1930" |
{ n , m }? | Соответствие предыдущему элементу с количеством вхождений между n и m, но с минимальным количеством. | "\d{3,5}?" | "166", "17668", В "193024" указаны "193" и "024" |
Обратная ссылка позволяет в одном регулярном выражении позже标识 ранее соответствующие подвыражения.
В таблице приведены конструкции обратной ссылки:
Конструкция обратной ссылки | Описание | Шаблон | Соответствие |
---|---|---|---|
\ номер | Обратная ссылка. Соответствие значению编号ного подвыражения. | (\w)\1 | В "seek" указаны "ee" |
\k< имя > | Именная обратная ссылка. Соответствие значению именованного выражения. | (?< символ>\w)\k< символ> | В "seek" указаны "ee" |
Резервные конструкции используются для изменения регулярного выражения для включения соответствия either/or.
В таблице приведены резервные конструкции:
Резервная конструкция | Описание | Шаблон | Соответствие |
---|---|---|---|
| | Соответствие любому из элементов, разделенных символом вертикальной черты (|). | th(е|is|at) | В "this is the day. " указаны "the" и "this" |
(?( выражение )да | нет ) | Если регулярное выражение шаблона соответствует expression, то соответствовать. yes; если нет, то соответствовать опциональному no Часть. expression интерпретируется как нулевая широта. | (?(A)A\d{2}\b|\b\d{3}\b) | "A10 C103 910" в "A10" и "910" |
(?( name )yes | no ) | Соответствовать, если name или уже именованная или уже нумерованная захваченная группа имеет соответствие yes; если нет, то соответствовать опциональному no. | (?< quoted>")?(?(quoted).+?"|\S+\s) | "Dogs.jpg "Yiska playing.jpg"" в "Dogs.jpg" и "Yiska playing.jpg" |
Заменить - это регулярное выражение, используемое в режиме замены.
В таблице перечислены символы, используемые для замены:
Символ | Описание | Шаблон | Режим замены | Строка ввода | Результат строки |
---|---|---|---|---|---|
$number | Заменить по группам number Соответствующий подстроке. | \b(\w+)(\s)(\w+)\b | $3$2$1 | "one two" | "two one" |
${name} | Заменить по именованным группам 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" |
В таблице перечислены различные конструктивные элементы:
Конструкция | Описание | Пример |
---|---|---|
(?imnsx-imnsx) | В середине шаблона устанавливать или отключать такие параметры, как нечувствительность к регистру. | \bA(?i)b\w+\b Соответствует "ABA Able Act" в "ABA" и "Able" |
(?#Комментарий) | Внутренний комментарий. Этот комментарий заканчивается в первом правом скобе. | \bA(?#Соответствует слову, начинающемуся на A)\w+\b |
# [Конец строки] | Этот комментарий начинается с неэscape-ированного # и продолжается до конца строки. | (?x)\bA\w+\b#Соответствует словам, начинающимся на 'A' |
Класс Regex используется для представления регулярного выражения.
В таблице ниже перечислены некоторые часто используемые методы класса Regex:
Номер | Методы & Описание |
---|---|
1 | public bool IsMatch(
string input
) Указать, найден ли указанный регулярный выражение в указанной входной строке. |
2 | public bool IsMatch(
string input,
int startat
) Указать, найден ли указанный регулярный выражение в указанной входной строке, начиная с указанного начала. |
3 | public static bool IsMatch(
string input,
string pattern
) Указать, найден ли указанный регулярный выражение в указанной входной строке. |
4 | public MatchCollection Matches(
string input
) Найти все соответствующие регулярному выражению совпадения в указанной входной строке. |
5 | public string Replace(
string input,
string replacement
) В указанной входной строке замените все соответствующие регулярному выражению строки указанной строкой замены. |
6 | public string[] Split(
string input
) Разделите входную строку на массив подстрок, используя указанные в конструкторе Regex регулярное выражение. |
Чтобы получить полный список свойств класса Regex, обратитесь к документации Microsoft C#.
Ниже приведен пример, который соответствует словам, начинающимся на 'S':
Когда上面的 код будет скомпилирован и выполнен, он произведет следующий результат:
Соответствующие слова начинаются на 'S': The Expression: \bS\S* Славный Солнца
Ниже приведен пример соответствия слов, начинающихся на 'm' и заканчивающихся на 'e':
using System; using System.Text.RegularExpressions; namespace RegExApplication { class Program { private static void showMatch(string text, string expr) { Console.WriteLine("The Expression: " + expr); MatchCollection mc = Regex.Matches(text, expr); foreach (Match m in mc) { Console.WriteLine(m); } } static void Main(string[] args) { string str = "делать лабиринт и управлять им, чтобы измерять его"; Console.WriteLine("Соответствующие слова начинаются на 'm' и заканчиваются на 'e':"); showMatch(str, @"\bm\S*e\b"); Console.ReadKey(); } } }
Когда上面的 код будет скомпилирован и выполнен, он произведет следующий результат:
Соответствующие слова начинаются на 'm' и заканчиваются на 'e': The Expression: \bm\S*e\b делать лабиринт управлять измерять
Ниже приведен пример замены избыточных пробелов:
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