#c_sharp #регулярные_выражения #c_sharp_70
Мне необходимо вставить в паттерн регулярного выражения: $@"^(?:[^\p{{L}}]|[{exclusion}])+$" //Цель: Запретить использование каких либо букв в строке, кроме тех что заданы в переменной - exclusion строковую переменную: string exclusion; в которой все управляющие символы были бы экранированы, что позволило бы избежать ошибок связанных с работой регулярного выражения. Я нашел метод Regex.Escape(). Но он не удовлетворяет моим потребностям. Например, если значение exclusion = @"[text]" передать в метод Regex.Escape() то он вернет строку "\\[text]". После вставки данной строки в паттерн вместо переменно exclusion: $@"^(?:[^\p{{L}}]|[{exclusion}])+$" //Цель: запретить использование каких либо букв в строке, кроме тех что заданы в переменной - exclusion он приобретает следующий вид: $@"^(?:[^\p{{L}}]|[\[text]])+$" В результате регулярное выражение работает неправильно. Подозреваю, что причина в лишнем символе - ] Скажите пожалуйста как экранировать все управляющие символы в строке? Есть ли какой то другой способ кроме метода - Regex.Escape()? Может быть я его как то неправильно использовал и не замечаю своей ошибки?
Ответы
Ответ 1
Regex.Escape экранирует те знаки, которые считаются специальными вне символьных классов: Escapes a minimal set of characters (\, *, +, ?, |, {, [, (, ), ^, $, ., #, and white space) by replacing them with their escape codes. (Экранирует минимальный набор знаков (\, *, +, ?, |, {, [, (, ), ^, $, ., # и пробельный символ) путём замены на их escape-коды) На самом деле, внутри символьных классов специальными считаются только следующие символы: ^ - может означать исклбчающий тип символьного класса, если находится сразу после открывающей [ ] - закрывает символьный класс \ - экранирует специальные символы - - задаёт диапазон символов или "вычитание символьных классов" Для экранирования этих знаков достаточно использовать exclusion.Replace("\\", @"\\").Replace("^", @"\^").Replace("-", @"\-").Replace("]", @"\]") или Regex.Replace(exclusion, @"[]^\\-]", "\\$&") Решение: var pattern = $@"^(?:[^\p{{L}}]|[{Regex.Replace(exclusion, @"[]^\\-]", "\\$&")}])+$"; Или (так как [^\p{L}] = \P{L}): var pattern2 = $@"^[\P{{L}}{Regex.Replace(exclusion, @"[]^\\-]", "\\$&")}]+$";
Комментариев нет:
Отправить комментарий