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


Использование регулярных выражений в Visual Studio

Visual Studio использует регулярных выражений .NET для поиска и замены текста.

Синтаксис регулярных выражений

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

Цель Выражение Пример
Соответствует любому одному символу (за исключением разрыва строки). Дополнительные сведения см. в разделе Любой символ. . a.o соответствует "aro" в "вокруг" и "abo" в "about", но не "acro" в "через"
Совпадение ноль или более раз предыдущего выражения (совпадая с максимально возможным количеством символов). Дополнительные сведения см. в разделе Совпадение ноль или более раз. * a*r соответствует "r" в "rack", "ar" в "ark", а "aar" в "aardvark"
Соответствует любому символу ноль или более раз. .* c.*e соответствует "cke" в "racket", "comme" в "комментарий" и "code" в "code"
Найдите одно или несколько вхождений предшествующего выражения (сопоставляя как можно больше символов). Дополнительные сведения см. в разделе Сопоставление одного или нескольких раз. + e+d совпадает с "eed" в "feeder" и "ed" в "faded"
Соответствует любому символу один или несколько раз. .+ e.+e совпадает с "eede" в "feeder", но не находит совпадений в "feed"
Соответствует нулю или нескольким вхождениям предыдущего выражения (совпадает с наименьшим количеством символов). Дополнительные сведения см. в разделе Совпадение нулевого или более раз (ленивое совпадение). *? \w*?d находит соответствия "fad" и "ed" в "faded", но не всё слово "faded" из-за ленивого соответствия.
Соответствует одному или нескольким вхождениям предыдущего выражения (совпадают как можно меньше символов). Дополнительные сведения см. в разделе Совпадение один или несколько раз, (ленивое совпадение). +? e\w+? совпадает с "ee" в "спящий" и "ed" в "угасший", но не находит совпадений в "fade"
Привязка строки сопоставления к началу строки или строки ^ ^car соответствует слову "автомобиль" только в начале строки.
Привязать строку сопоставления к концу строки \r?$ car\r?$ соответствует "автомобиль" только в конце строки
Привязка строки сопоставления к концу файла $ car$ совпадает с "автомобиль" только если оно появляется в конце файла.
Сопоставление любого одного символа в наборе [abc] b[abc] соответствует "ba", "bb" и "bc"
Сопоставьте любой символ в диапазоне символов [a-f] be[n-t] соответствует "bet" в "between", "ben" в "beneath" и "bes" в "beside", но не находит соответствий в "below"
Зафиксируйте и присвойте неявный номер выражению, содержащемуся в скобках () ([a-z])X\1 соответствует "aXa" и "bXb", но не "aXb". "\1" ссылается на первую группу выражений "[a-z]". Дополнительные сведения см. в группах записи и шаблонах замены.
Аннулировать матч (?! abc) real(?!ity) соответствует "реал" в "реальность" и "действительно", но не в "реальности". Он также находит второй "реал" (но не первый "реал") в "реалреал".
Соответствует любому символу, не указанному в заданном наборе символов. Дополнительные сведения см. в разделе Отрицательные группы символов. [^abc] be[^n-t] сопоставляется с "bef" в "before", "beh" в "behind" и "bel" в "below", но не находит совпадений в "beneath"
Сопоставьте либо выражение перед, либо после символа. | (sponge|mud) bath совпадения "обтирание губкой" и "грязевая ванна"
"Escape" символ после обратной косой черты \ \^ соответствует символу ^
Укажите количество вхождений предыдущего символа или группы. Дополнительные сведения см. в разделе Match в точности n раз. {n}, где "n" — это число вхождений x(ab){2}x соответствует "xababx"
x(ab){2,3}x совпадает с "xababx" и "xabababx", но не с "xababababx"
сопоставление текста в категории Unicode. Дополнительные сведения о классах символов Юникода см. в разделе Свойства символов стандарта Юникода 15.0. \p{X}, где "X" — номер Юникода. \p{Lu} совпадает с "Т" и "Д" в "Томас Доу"
Найти границу слова \b (вне класса символов \b указывает границу слова, а внутри класса символов \b задает внутреннее пространство.) \bin находит совпадения 'in' в 'внутри', но не находит совпадений в 'pinto'
Соответствует разрыву линии (т. е. возврат каретки, за которой следует новая строка или только новая строка) \r?\n End\r?\nBegin совпадает с "End" и "Begin", только если "End" является последней строкой в строке, а "Begin" — первой строкой в следующей строке.
Сопоставление любого символа слова \w a\wd соответствует "add" и "a1d", но не "a d"
Сопоставление любого символа, отличного от слова \W a\Wd соответствует "a d", но не "и"
Сопоставьте любой символ пробела \s Public\sInterface соответствует фразе "Общедоступный интерфейс"
Сопоставление любого символа, отличного от пробелов \S \S+ соответствует "end", "A11" или "end?".
Соответствие любым символам десятичной цифры \d \d соответствует символам "4" и "0" в "WD40"
Сопоставление любого незначного символа \D \D соответствует "w" и "d" в "wd40"

Пример регулярного выражения, объединяющего некоторые операторы и конструкции для сопоставления шестнадцатеричного числа, \b0[xX]([0-9a-fA-F]+)\b. Это выражение соответствует "0xc67f", но не "0xc67g".

Совет

В операционных системах Windows большинство строк заканчиваются в "\r\n" (возврат каретки, за которой следует новая строка). Эти символы не видны, но присутствуют в редакторе и передаются в службу регулярных выражений .NET. При работе с файлами из Интернета или из операционной системы, отличной от Windows, обязательно учитывайте возможность использования новой строки только для разрыва строки.

Группы захвата и шаблоны замены

Группа отслеживания определяет подтекст регулярного выражения и записывает подстроку входной строки. Вы можете использовать захваченные группы в самом регулярном выражении (например, для поиска повторяющегося слова) или в шаблоне замены. Для получения подробной информации см. раздел Конструкции группировки в регулярных выражениях.

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

  • Врегулярном выражении: используйте \number. Например, \1 в регулярном выражении (\w+)\s\1 ссылается на первую группу записи (\w+).

  • В шаблоне замены: используйте $number. Например, группированные регулярные выражения (\d)([a-z]) определяют две группы: первая группа содержит одну десятичную цифру, а вторая группа содержит один символ между и z. Выражение находит четыре совпадения в следующей строке: 1a 2b 3c 4d. Строка замены z$1 ссылается только на первую группу ($1) и преобразует строку в z1 z2 z3 z4.

На следующем рисунке показано регулярное выражение (\w+)\s\1 и строка замены $1. Регулярное выражение и шаблон замены ссылаются на первую захваченную группу, которая автоматически нумеруется 1. При выборе Заменить все в диалоговом окне Быстрая замена в Visual Studio повторяющиеся слова удаляются из текста.

снимок экрана Быстрая Замена с нумерованной группой захвата в Visual Studio.

Совет

В диалоговом окне быстрая замена выберите кнопку Использовать регулярные выражения или нажмите клавиши Alt+E.

Именованные группы захвата

Вместо того чтобы полагаться на автоматическое нумерирование группы отслеживания, вы можете присвоить ему имя. Синтаксис именованной группы захвата (?<name>subexpression).

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

  • Врегулярном выражении: используйте \k<name>. Например, \k<repeated> в регулярном выражении (?<repeated>\w+)\s\k<repeated> ссылается на группу захвата, которая называется repeated, и подвыражение которой \w+.

  • В шаблоне замены: используйте ${name}. Например, ${repeated}.

На следующем рисунке показано регулярное выражение (?<repeated>\w+)\s\k<repeated> и строка замены ${repeated}. Регулярное выражение и шаблон замены ссылаются на группу захвата, называемую repeated. При выборе Заменить все в диалоговом окне Быстрая замена в Visual Studio повторяющиеся слова удаляются из текста.

снимок экрана функции быстрой замены с именованной группой захвата в Visual Studio.

Совет

Выберите кнопку Использовать регулярные выражения (или нажмите клавиши Alt+E) в диалоговом окне Быстрая замена.

Дополнительные сведения о именованных группах захвата см. в именованных совпадающих подвыражений. Дополнительные сведения о регулярных выражениях, используемых в шаблонах замены, см. в разделе «Подстановки в регулярных выражениях».

Примеры

Рисунок Описание
int ([_A-Za-z][_A-Za-z0-9]*) Сопоставление определений одного целочисленного числа. Идентификаторы начинаются с одной заглавной или строчной буквы, за которой следует ноль или больше символов, как указано *, которые могут быть буквами или цифрами. Внешние скобки фиксируют идентификатор как $1.
(private\|internal\|public)*\s*([\w]+\s+)int\s+([_A-Za-z][_A-Za-z0-9]*)\s+=\s+[+-]+(\d)+ Найти объявления целых чисел в C#, которые инициализированы целыми литералами, включая различные части, такие как уровень доступа, модификаторы, такие как const или static, идентификатор и заданное значение. Обратите внимание на использование \s+ по крайней мере для одного символа пробела или \s*, если пробел может присутствовать или отсутствовать.
foreach\s*\(([\w\d]*)\s+([\w\d]*)\s+in\s+(.*)\) Соответствует открывающей строке цикла foreach. Литеральные скобки экранируются с обратной косой чертой (\). Различные группы записываются как $1, $2и $3 незапечатанными скобками.
#define\s+([_A-Za-z][_A-Za-z0-9]*) Соответствует определениям #define (без значения, если таковые имеются). Определенный маркер хранится в $1.
#include\s+["<](.*)[">] Сопоставление включается в исходный файл C++.