Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csSpRgESCh 4 of 509 menu
◀ ▶

Экранировка спецсимволов в регулярках C#

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

В следующем примере автор регулярки хотел, чтобы шаблон поиска выглядел так: буква "'a'", затем плюс "'+'", затем буква "'x'". Однако, автор кода не заэкранировал символ "'+'" и поэтому шаблон поиска на самом деле выглядит так: буква "'a'" один или более раз, потом буква "'x'":

using System.Text.RegularExpressions; string txt = "a+x ax aax aaax"; string res = Regex.Replace(txt, @"a+x", "!"); Console.WriteLine(res);

А сейчас автор заэкранировал плюс обратным слешем. Теперь шаблон поиска выглядит так, как надо: буква "'a'", затем плюс "'+'", затем буква "'x'":

using System.Text.RegularExpressions; string txt = "a+x ax aax aaax"; string res = Regex.Replace(txt, @"a\+x", "!"); Console.WriteLine(res);

В данном примере шаблон выглядит так: буква "'a'", затем точка "'.'", затем буква "'x'":

using System.Text.RegularExpressions; string txt = "a.x abx azx"; string res = Regex.Replace(txt, @"a\.x", "!"); Console.WriteLine(res);

А в следующем примере автор забыл заэкранировать точку и под регулярку попали все подстроки, так как незаэкранированная точка обозначает любой символ:

using System.Text.RegularExpressions; string txt = "a.x abx azx"; string res = Regex.Replace(txt, @"a.x", "!"); Console.WriteLine(res);

Обратите внимание на то, что если вы забудете обратный слеш для точки (когда она должна обозначать сама себя) - этого можно даже не заметить:

using System.Text.RegularExpressions; string txt = "a.x"; string res = Regex.Replace(txt, @"a.x", "!"); Console.WriteLine(res);

Визуально работает правильно (так как точка обозначает любой символ, в том числе и обычную точку "'.'"). Но если поменять строку, в которой происходят замены - мы увидим нашу ошибку:

using System.Text.RegularExpressions; string txt = "a.x abx azx"; string res = Regex.Replace(txt, @"a.x", "!"); Console.WriteLine(res);

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

Часто возникает сомнение, является ли данный символ специальным. Некоторые доходят до того, что экранируют все подозрительные символы подряд. Однако, это плохая практика (захламляет регулярку обратными слешами).

Являются спецсимволами: $ ^ . * + ? \ {} [] () |

Не являются спецсимволами: @ / :, ' " - _ = < > % # ~ `& !

Дана строка:

string txt = "a.a aba aea";

Напишите регулярку, которая найдет строку "'a.a'", не захватив остальные.

Дана строка:

string txt = "2+3 223 2223";

Напишите регулярку, которая найдет строку "'2+3'", не захватив остальные.

Дана строка:

string txt = "23 2+3 2++3 2+++3 345 567";

Напишите регулярку, которая найдет строки "'2+3'", "'2++3'", "'2+++3'", не захватив остальные (+ может быть любое количество).

Дана строка:

string txt = "23 2+3 2++3 2+++3 445 677";

Напишите регулярку, которая найдет строки "'23'", "'2+3'", "'2++3'", "'2+++3'", не захватив остальные.

Дана строка:

string txt = "*+ *q+ *qq+ *qqq+ *qqq qqq+";

Напишите регулярку, которая найдет строки "'*q+'", "'*qq+'", "'*qqq+'", не захватив остальные.

Дана строка:

string txt = "[abc] {abc} abc (abc) [abc]";

Напишите регулярку, которая найдет строки в квадратных скобках и заменит их на "'!'".

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить