Обращение с текстом замены escape-выражения регулярного выражения, которое содержит символ доллара

18
string input = "Hello World!";
string pattern = "(World|Universe)";
string replacement = "";

string result = Regex.Replace(input, pattern, replacement);

В следующем примере результатом будет "Hello World!" , так как будет заменено первой группой (World|Universe) , однако результат, который я хочу, равен "Hello !"

Метод Regex.Escape предназначен для использования шаблона Regex, а не замены, поскольку он может вызывать другие символы, такие как косые черты и другие символы шаблона Regex. Очевидное решение моей проблемы состоит в том, чтобы моя замена была равна "$" и достигнет "Hello !" , но мне было интересно, является ли знак доллара единственным значением, которое мне нужно избежать (при условии, что replacement генерируется пользователем, и Я не знаю этого заранее), или есть вспомогательная функция, которая делает это уже.

Кто-нибудь знает о функции, чтобы избежать значения замены, которое использует Regex.Replace(string input, string pattern, string replacement) ?

    
задан Matthew 09.04.2012 в 20:57
источник

1 ответ

17

Из MSDN :

  

Параметр replacement указывает строку, которая должна заменить каждое соответствие в input . замена может состоять из любой комбинации литерального текста и подстановок .

Определены следующие подстановки :

  • $ число
  • $ {имя}
  • $$
  • $ & амп;
  • $
  • $
  • $ +
  • $ _
  

Замены являются единственными специальными конструкциями, признанными в шаблоне замены. Поддерживаются ни один из других элементов языка регулярных выражений, включая escape-символы символов и период (.), Который соответствует любому символу. Аналогично, элементы языка замещения распознаются только в шаблонах замещения и никогда не действительны в шаблонах регулярных выражений.

Итак, похоже, что нужно просто экранировать символ $.

    
ответ дан dtb 09.04.2012 в 21:07
  • Также из MSDN: Замены являются единственными элементами языка регулярного выражения, которые распознаются в шаблоне замены. Все остальные элементы языка регулярных выражений, включая escape-символы символов, допускаются только в шаблонах регулярных выражений и не распознаются в шаблонах замещения. –  Gebb 09.04.2012 в 21:10
  • Это выглядит достаточно хорошо для меня, я подозреваю, что я сделал замену немой. Замена («$», «$$») должна быть хорошей в 100% случаев? –  Matthew 09.04.2012 в 21:18
  • Да, replace.Replace ("$", "$$") должно быть всем, что вам нужно. –  dtb 09.04.2012 в 21:19
  • Отлично, спасибо @dtb –  Matthew 09.04.2012 в 21:20