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

Особенности дефиса внутри наборов в C#

Дефис - тоже спецсимвол внутри [ ] (а вот снаружи - нет). Если вам нужен сам дефис как символ - то поставьте его там, где он не будет воспринят как разделитель группы.

Почему это важно: вы можете сделать группу символов, сами не заметив этого. К примеру, вот так - "'[:-@]'" - вы думаете, что выбираете двоеточие, дефис и собаку, а на самом деле получается диапазон от двоеточия до собаки включительно. В него входят символы : ; < = > ? @.

Откуда они взялись? Из таблицы ASCII - двоеточие имеет номер меньше, чем собака - и получается диапазон. То есть все группы получаются по таблице ASCII (при желании этим можно пользоваться).

Как с этим бороться: поставьте символ дефиса там, где он точно не будет воспринят как символ группы, например, в начале или в конце (то есть после [ или перед ]).

Можно также заэкранировать дефис - тогда он будет обозначать сам себя независимо от позиции. Например, вместо [:-@] написать [:\-@] - и группы уже не будет, а будут три символа - двоеточие, дефис и собака @.

В следующем примере шаблон поиска такой: цифра 1, затем буква от "'a'" до "'z'", затем цифра 2:

using System.Text.RegularExpressions; string txt = "1a2 1-2 1c2 1z2"; string res = Regex.Replace(txt, @"1[a-z]2", "!"); Console.WriteLine(res);

Теперь заэкранируем дефис. В результате шаблон поиска такой: цифра 1, затем буква "'a'", или дефис, или буква "'z'", затем цифра 2:

using System.Text.RegularExpressions; string txt = "1a2 1-2 1c2 1z2"; string res = Regex.Replace(txt, @"1[a\-z]2", "!"); Console.WriteLine(res);

Можно просто переставить дефис, не экранируя его:

using System.Text.RegularExpressions; string txt = "1a2 1-2 1c2 1z2"; string res = Regex.Replace(txt, @"1[az-]2", "!"); Console.WriteLine(res);

В следующем примере шаблон поиска такой: первый символ - это маленькие буквы или дефис "'-'", потом две буквы "'x'":

using System.Text.RegularExpressions; string txt = "axx Axx -xx @xx"; string res = Regex.Replace(txt, @"[a-z-]xx", "!"); Console.WriteLine(res);

В следующем примере шаблон поиска такой: первый символ - это маленькие, большие буквы или дефис "'-'", потом две буквы "'x'":

using System.Text.RegularExpressions; string txt = "axx Axx -xx @xx"; string res = Regex.Replace(txt, @"[a-zA-Z-]xx", "!"); Console.WriteLine(res);

Можно расположить дефис между двумя группами - там он точно не сделает еще одну группу:

using System.Text.RegularExpressions; string txt = "axx 9xx -xx @xx"; string res = Regex.Replace(txt, @"[a-z-0-9]xx", "!"); Console.WriteLine(res);

Дана строка:

string txt = "xaz xBz xcz x-z x@z";

Найдите все строки по следующему шаблону: буква "'x'", большая или маленькая буква или дефис, буква "'z'".

Дана строка:

string txt = "xaz x$z x-z xcz x+z x%z x*z";

Найдите все строки по следующему шаблону: буква "'x'", затем или доллар, или дефис или плюс, потом буква "'z'".

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