2013-05-29 3 views
1

Я пытаюсь написать регулярное выражение, которое берет строку символа и строит их в выражение как диапазон. Я использую Regex.Escape (.net 3.5) для дезинфекции этих строк, чтобы не осталось никаких контрольных символов. Но кажется, что метод Escape работает не так, как ожидалось, и не сможет избежать закрытия } или ] символов. Разве это не ускользает от них? Вот пример того, что я делаю:.Net Regex.Escape работает неправильно?

string test = @"sdfz346gv][)(}{><"; 
string pattern = "[" + Regex.Escape(test) + "]+"; 
string input = "ffff{444}g"; 

if (Regex.IsMatch(input, pattern)) 
{ 
    Console.WriteLine("Matched"); 
} 
else 
{ 
    Console.WriteLine("Not Matched"); 
} 

Строка pattern, кажется, имеет значение [sdfz346gv]\[\)\(}\{><]+ и не будет соответствовать ffff{444}g, но, насколько я понимаю это должно выглядеть следующим образом [sdfz346gv\]\[\)\(\}\{><]+ который является выражением который выполняет по-другому и будет соответствовать ffff{444}g. Я мог бы просто заменить } и ] персонажами с \} и \], но есть ли другие символы, которые не могут быть экранированы этим методом эвакуации? Могу ли я на это положиться?

+0

Я не хочу, чтобы он избежал последнего символа ']', я хочу, чтобы он избежал предпоследнего. В противном случае он изменяет значение выражения. - Извините, я вижу, что вы имеете в виду (опечатка в вопросе, исправлена), но проблема все еще остается. – JonM

+0

Затем отредактируйте свой вопрос. Вы четко говорите: «Насколько мне известно, это должно выглядеть так: [sdfz346gv] \ [\) \ (\} \ {><\] +' ", что ускользает от последнего'] '. want is '[sdfz346gv \] \ [\) \ (\} \ {><] +' –

+0

Мы просто не встречаем друг друга :) – JonM

ответ

4

От here:

Экранирует минимальный набор символов (\, *, +,, |, {, [, (,), ^, $,, # и белое пространство?). заменяя их кодами побега.

И

Хотя метод побега избегает прямой открывающей скобки ([) и открывающей скобки ({) символов, не избежать их соответствующих закрывающих символов (] и}). В большинстве случаев избежать этого не требуется. Если закрывающей скобе или скобе не предшествует соответствующий символ открытия, механизм регулярного выражения интерпретирует его буквально.

+0

Если это так, то я полагаю, что нецелесообразно конкатенировать строки с расширенным регулярным выражением с регулярным выражением, в которых есть управляющие символы ... Это похоже на то, что он побеждает цель избежать их в первую очередь! – JonM

+0

@JonM: метасимволы Regex теряют или изменяют свое значение внутри классов персонажей. Если вы планируете помещать строку 'Regex.Escape()' d в класс символов, вы должны «вручную» вывести символы ']' и '-'. –

+1

@JonM: Microsoft действительно кажется странным предположением, что вам не нужно избегать закрывающей скобки или скобки. «В большинстве случаев» - это только тот случай, когда нет другого набора скобок или фигурных скобок, которые не должны интерпретироваться как литералы. Я думаю, что вы, вероятно, безопасны, если просто просто замените '' '' '' и '' '' '' 'и' \} 'перед созданием шаблона регулярного выражения. –

Смежные вопросы