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


Использование регулярных выражений в 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"
Сопоставьте любой символ пробела \s Public\sInterface соответствует фразе "Общедоступный интерфейс"
Соответствие любым символам десятичной цифры \d \d соответствует символам "4" и "0" в "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++.