Особенности дефиса внутри наборов в 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'".