Регулярные выражения visual studio

Обновлено: 04.07.2024

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

Регулярное выражение используется для проверки соответствия строки шаблону. Регулярное выражение (regular expression или regex, или regexp) — это последовательность символов, которая определяет шаблон. Шаблон может состоять из литералов, чисел, символов, операторов или конструкций. Шаблон используется для поиска соответствий в строке или файле.
Регулярные выражения часто используются при проверке входных данных, анализе и поиске строк. Например, проверка достоверной даты рождения, номера социального страхования, полного имени, в котором имя и фамилия разделены запятой, поиск числа вхождений подстроки, замена подстрок, форматов даты, допустимых форматов электронной почты, формата валюты, и так далее.

Класс Regex

Класс Regex определен в пространстве имен System.Text.RegularExpressions. Конструктор класса Regex принимает в качестве параметра строку шаблона вместе с другими необязательными параметрами.

Следующий фрагмент кода создает регулярное выражение из шаблона. Здесь шаблон соответствует слову, начинающемуся с буквы «M».

Следующий фрагмент кода содержит длинный текст с именами авторов, которые необходимо проанализировать.

Метод Matches используется для поиска всех совпадений в регулярном выражении и возвращает MatchCollection.

Следующий фрагмент кода проходит по коллекции совпадений.

В приведенном выше примере код ищет символ «M». Но что, если слово начинается с «м». Следующий фрагмент кода использует параметр RegexOptions.IgnoreCase , для того, чтобы Regex не обращал внимания на регистр.

Замена множественных пробелов с помощью Regex

Метод Regex.Replace() используется для замены совпавшей строки новой строкой. В следующем примере выполняется поиск множественных пробелов в строке с заменой на единичный.

Следующий фрагмент кода заменяет пробелы на ‘-‘.

Разбиение строки на символы с помощью Regex

В следующем примере шаблон регулярного выражения [a-z] + и метод Regex.Split() используются для разделения строки на символы без учета их регистра.

Регулярные выражения являются стандартом сопоставления с шаблоном для синтаксического анализа и изменения строк, и позволяют пользователю выразить, как компьютерная программа должна искать указанный шаблон в тексте, а затем, что она должна делать, когда найдено каждое совпадение с данным шаблоном. Иногда их сокращают как «regex». Они являются мощным способом поиска и изменения строк, которые принимают определенный формат.

Regex для проверки электронной почты

Для проверки множества адресов электронной почты мы можем использовать следующие регулярные выражения. Мы разделяем адреса с помощью разделителя ';'

Если вы хотите использовать разделитель ',', то используйте следующее

и если вы хотите использовать оба разделителя ',' и ';' то используйте это

Таким образом, используя приведенное выше регулярное выражение, вы можете проверять как один, так и несколько адресов сразу.

Проверка пользовательского ввода с помощью регулярных выражений

Мы можем использовать метод Regex.Match, который принимает входные данные и регулярное выражение, и возвращает success, если

Для использования Regex для разбиения строки нужно добавить следующие пространства имен.

Отделить цифры от строк с помощью Regex.

Приведенный выше код разбивает строку, используя \D+, и выводит цифры посредством итерации по результату.

Узнайте больше можно здесь:

Заменить специальные символы из строки с помощью Regex

Если у вас есть строка со специальными символами и вы хотите удалить или заменить их, вы можете использовать для этого регулярное выражение.

Используйте следующий код:

Этот код удалит все специальные символы, но если вы не хотите удалять некоторые специальные символы, например, запятую "," и двоеточие ":" — внесите следующие изменения:

Точно так же вы можете вносить изменения в соответствии с вашими требованиями.

Следует отметить, что регулярные выражения не являются панацеей для каждой небольшой манипуляции со строкой. Если вам нужен простой синтаксический анализ, предоставляемый классом String или другими классами, старайтесь его и использовать.

Для дальнейшего прочтения

Если вы новичок в регулярных выражениях, я рекомендую прочитать эту статью "Введение в регулярные выражения".

Примеры регулярных выражений

В таблице ниже собраны некоторые символы, операторы, конструкции и примеры для регулярных выражений. Более подробный справочник по регулярным выражениям вы найдете здесь.

Назначение Expression Пример
Соответствует любому одиночному символу, кроме разрыва строки Дополнительные сведения см. в разделе Любой символ. . a.o совпадает с "ато" в слове "каток" и "aзo" в слове "азот", но не с "арто" в слове "картон"
Соответствует нулю или большему числу вхождений предыдущего выражения (совпадение с максимальным числом символов). Дополнительные сведения см. в разделе Совпадение ноль или несколько раз: *. * a*r совпадает с "в" в слове "винт" и "ав" в слове "авто".
Соответствует любому символу ноль или более раз. .* c.*e совпадает со "сне" в слове "снег", "сове" в слове "совет" и "скате" в слове "скатерть"
Соответствует одному или большему числу вхождений предыдущего выражения (совпадение с максимальным числом символов) Дополнительные сведения см. в разделе Совпадение один или несколько раз: +. + e+d совпадает с "eed" в "feeder" и с "ed" в "faded".
Сопоставление любого символа один или более раз. .+ e.+e совпадает с "eede" в "feeder", но в "feed" совпадения отсутствуют.
Соответствует нулю или большему числу вхождений предыдущего выражения (совпадение с минимальным числом символов) Дополнительные сведения см. в разделе Совпадение ноль или несколько раз (ленивое совпадение): *?. *? \w*?d совпадает с "fad" и "ed" в "faded", но не со всем словом "faded", так как проверяется соответствие с минимальным числом символов.
Соответствует одному или большему числу вхождений предыдущего выражения (совпадение с минимальным числом символов) Дополнительные сведения см. в разделе Совпадение один или несколько раз (ленивое совпадение): +?. +? e\w+? совпадает с "ee" в "asleep" и с "ed" в "faded", но в "fade" совпадения отсутствуют.
Привязывает сопоставляемую строку к началу строки. ^ ^car совпадает с такими словами, как "продажа" и "процесс", только если они находятся в начале строки
Привязывает сопоставляемую строку к концу строки. \r?$ car\r?$ совпадает со словом "car", только если оно находится в конце строки.
Соответствует вхождению, только если оно находится в конце файла $ car$ совпадает со словом "car", только если оно находится в конце файла.
Соответствует любому отдельному символу в наборе. [abc] b[abc] совпадает с "ба", "бб" и "бв"
Соответствует любому символу в диапазоне символов. [а-е] be[n-t] совпадает с "bet" в слове "between", с "ben" в слове "beneath" и с "bes" в слове "beside", но в слове "below" совпадения отсутствуют.
Запись и неявная нумерация выражения в скобках () ([a-z])X\1 совпадает с "аХа" и "бХб", но не с "аХб". "\1" относится к первой группе выражения "[а–я]". Дополнительные сведения см. в разделе Группы записи и шаблоны замены.
Признание соответствия недействительным (?!абв) real(?!ity) совпадает со словами "реальный" и "реальность", но не со словом "реальная". Кроме того, находит второй элемент "реальн" (но не первый "реальн") в "реальнаяреальность".
Соответствует любому символу, не входящему в указанный набор. Дополнительные сведения см. в разделе Отрицательная группа символов. [^абв] be[^n-t] совпадает с "bef" в слове "before", с "beh" в слове "behind" и с "bel" в слове "below", но в слове "beneath" совпадения отсутствуют.
Совпадает с выражением до или после символа. | (sponge|mud) bath совпадает со строками "хвойный лес" и "лиственный лес"
Экранирует символ, указанный за обратной косой чертой. \ \^ соответствует символу ^
Определяет количество вхождений предыдущего символа или группы. Дополнительные сведения см. в разделе Совпадение ровно n раз: . , где n обозначает число вхождений. x(ab)x совпадает с "xababx"
x(ab)x совпадает с "xababx" и "xabababx", но не "xababababx"
Сопоставление текста в категории Юникода. Дополнительные сведения о классах символов Юникода, см. в документе о свойствах символов в стандарте Юникода 5.2. \p, где "X" — число из Юникода. \p совпадает с "T" и "D" в "Thoma Doe"
Соответствует границе слова \b (вне класса символов \b определяет границу слова, а внутри класса \b символов определяет стирание назад) \bin совпадает с "in" в "inside", но в "pinto" совпадения отсутствуют.
Соответствует разрыву строки (то есть возврату каретки с последующим символом новой строки). \r?\n End\r?\nBegin совпадает со словами "Конец" и "Начало", только если "Конец" является последним словом в строке, а "Начало" — первым словом в следующей строке
Соответствует любому алфавитно-цифровому знаку. \w a\wd совпадает с "акт" и "а1т", но не с "а т"
Соответствует любому символу пробела. \s Public\sInterface совпадает с фразой "Открытый интерфейс"
Соответствует любому символу десятичной цифры \d \d совпадает с "4" и "0" в "wd40".

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

Группы записи и шаблоны замены

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

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

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

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

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

Панель быстрой замены в Visual Studio, где отображается нумерованная группа записи

Убедитесь, что в диалоговом окне Быстрая замена нажата кнопка Использовать регулярные выражения.

Именованные группы записи

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

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

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

Внутри шаблона замены: Используйте ключевое слово $ . Например, $ .

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

Панель быстрой замены в Visual Studio, где отображается именованная группа записи

Убедитесь, что в диалоговом окне Быстрая замена нажата кнопка Использовать регулярные выражения.

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

Как я могу этого добиться?

Итак, ваша цель - поиск и замена?
Согласно PDF-файлу с клавишами официальной Visual Studio, вы можете нажать Ctrl + H в Windows и Linux или ⌥⌘F на Mac, чтобы включить инструмент поиска и замены:

И, как предложил @tpartee , вот еще немного информации о движке Visual Studio, если вы хотите узнать больше:

Visual Studio будет обрабатывать регулярное выражение, как и любое другое приложение, с той лишь разницей, что это так называемые разновидности регулярных выражений, которые являются «компилятором» регулярного выражения и как он будет обрабатывать выражение. Обычно он игнорируется в подобных ответах, потому что большинство из них довольно похожи, но для тех, кто все еще хочет проверить это, я добавил его в ответ Вопрос касается кода Visual Studio, а этот ответ - Visual Studio.

Для новичков я хотел добавить к принятому ответу, потому что мне были непонятны несколько тонкостей:

Чтобы найти и изменить текст (не полностью заменить),

На шаге «Найти» вы можете использовать регулярное выражение с «захватывающими группами», например, ваш поиск может осуществляться la la la (group1) blah blah (group2) с использованием круглых скобок.

Затем на шаге «Заменить» вы можете ссылаться на группы захвата через $1 и $2 т. Д.

Так, например, в этом случае мы могли бы найти соответствующий текст просто <h1>.+?<\/h1> (без круглых скобок), но вставка скобок <h1>(.+?)<\/h1> позволяет нам ссылаться на промежуточное совпадение между ними, как $1 на этапе замены . Прохладно!

Чтобы включить регулярное выражение в виджете поиска, щелкните .* значок или нажмите Cmd/Ctrl Alt R

$0 относится ко всему матчу

Наконец, в исходном вопросе говорится, что замена должна происходить «внутри документа», поэтому вы можете использовать «Виджет поиска» ( Cmd или Ctrl + F ), который является локальным для открытого документа, вместо «Поиск», который открывает больший пользовательский интерфейс. и просматривает все файлы в проекте.

Убедитесь, что параметр «Учитывать регистр» выбран с помощью параметра «Использовать регулярное выражение», чтобы это совпадало. [AZ] * Если регистр совпадения не выбран, будут совпадать все буквы.

Перевод статьи «Simple RegEx tricks for beginners».

RegEx для начинающих

Всегда хотели изучить регулярные выражения, но их сложность пугала? В этой статье я покажу несколько простых, легких для запоминания приемов RegEx, которые вы сможете сразу же начать применять в своем редакторе кода.

Настройка редактора кода

Регулярные выражения в настоящее время поддерживаются практически всеми редакторами, вы можете выбирать любой. Я при написании этой статьи пользовался Visual Studio Code. Учтите, что обычно нужно еще включить RegEx где-то возле окна поиска. Вот, например, включение RegEx в VS Code:

Включение RegEx

Включение RegEx

1. Точка представляет любой символ (причем один)

Начнем с простого. Символ точки в регулярном выражении обозначает любой символ.

Применение точки в регулярном выражении

Регулярное выражение, указанное выше, совпадает с «bot», «bat» и любыми другими словами из трех букв, начинающимися на «b» и заканчивающимися на «t». Но если в искомом слове должен быть сам символ точки, в регулярном выражении его нужно экранировать при помощи обратной косой черты \. Это регулярное выражение совпадет с «b.t»:

Экранирование точки

Экранирование точки

2. Точка со звездочкой могут представлять любые символы в любом количестве

В этом сочетании точка означает «один любой символ», а звездочка означает, что символ, стоящий перед ней, может повторяться любое количество раз. Это сочетание можно применять, например, если вам нужно найти строки, в которых вам известно начало или конец. Предположим, у нас есть метод JavaScript со следующей сигнатурой:

И мы хотим найти все вызовы этого метода, где pathToFile указывает на любой файл в папке «lua». Для этого можно использовать следующее регулярное выражение:

Расшифровывается это так: «Найди совпадение с любым текстом, начинающимся с «loadScript» и заканчивающимся на «lua», причем между указанными началом и концом может идти что угодно».


3. Вопросительный знак — «не жадное» совпадение

Вопросительный знак, стоящий после .* (точки со звездочкой) и некоторых других последовательностей RegEx, означает «найди как можно меньшее совпадение».

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

Но если вам нужно, чтобы регулярное выражение совпадало со строками только в части, заканчивающейся первым вхождением «lua», написать его можно так:

Это регулярное выражение означает: «Найди совпадение с любой строкой, начинающейся с «loadScript» и заканчивающейся первым вхождением «lua», а между началом и концом могут быть любые другие символы».


4. Группирование символов

Окей, теперь мы можем искать совпадения. Но что, если нам нужно не только найти, но и изменить части найденного текста? Здесь нам пригодится группирование символов.

Предположим, мы изменили наш метод loadScript и теперь внезапно потребовалось вставить еще один аргумент между теми двумя, что были там раньше. Пускай этим новым аргументом будет id. То есть, теперь сигнатура функции будет выглядеть следующим образом:

Мы не можем воспользоваться обычным функционалом замены в нашем редакторе, но регулярное выражение способно нам помочь.


loadScript(.*. *?)

Это результат запуска следующего регулярного выражения:

Расшифровывается оно так: «Найди любую строку, начинающуюся с текста «loadScript(», за которым идут любые другие символы до первого вхождения символа запятой, после чего идет что угодно до первого вхождения закрывающей скобки».

Единственное, что здесь может выглядеть странно, это обратные слэши (\) — они служат для экранирования скобок.

Скобки нужно экранировать, потому что они относятся к числу специальных символов и используются в RegEx для группирования частей текста. Но в данном случае нам нужно искать сами скобки в их буквальном смысле.

В предыдущем регулярном выражении вы определили два аргумента нашего вызова метода при помощи сочетания символов .*?. Давайте сделаем каждый из наших аргументов отдельной группой, для этого окружим каждое сочетание скобками:

Если вы запустите это регулярное выражение, вы не заметите никаких изменений. Это потому, что выражение соответствует тому же тексту. Но теперь мы можем обращаться к этим аргументам, используя обратные ссылки $1 и $2. Таким образом мы сможем добавить еще один аргумент в середину вызова.

В окне поиска вводим

Это такой же поиск, как и с предыдущим выражением, только аргументы представлены в виде групп 1 и 2.

В окне замены вводим

Это означает «Замени найденный текст текстом «loadScript(», за которым идет группа 1, «id», группа 2 и закрывающая скобка».

Обратите внимание, что для замены экранировать скобки не нужно.


Результат замены

5. Классы символов

Если какой-то символ может быть представлен, к примеру, любой цифрой, любой строчной буквой, любой цифрой из диапазона, то есть, любым символом определенного класса, можно указать варианты допустимых символов и окружить их квадратными скобками.

Таким образом, если указан класс 8 это может быть любая цифра от 0 до 9. Можно перечислить их явно — [0123456789], смысл при этом не меняется. Буквы тоже можно перечислять, а можно указывать при помощи дефиса, например, [a-z] это любая буква латинского алфавита в нижнем регистре, [A-Z] — в верхнем регистре, [a-zA-Z] — вообще любая буква латинского алфавита.

После указания класса символов можно использовать звездочку (как мы уже делали в сочетании точки и звездочки). Тогда такое выражение будет означать «любое число вхождений символов из этого класса».


expect.*to.equal\([0–9]*\)

Послесловие

Следует знать, что есть несколько разновидностей регулярных выражений. Я говорил о регулярных выражениях в JavaScript. Современные варианты движков RegEx похожи, но могут иметь и отличия. Обычно отличаются способы экранирования символов и обратные ссылки.

Надеюсь, вы откроете редактор и сразу попробуете применить эти регулярные выражения. Вы увидите, что теперь сможете гораздо быстрее справляться со многими задачами рефакторинга.

Читайте также: