2015-02-23 2 views
0

Я использовал StringBuilder.Replace(), чтобы изменить некоторые «ключевые слова» на мои собственные методы, но поскольку он не соответствует всему слову, мне нужно найти способ его правильно заменить.

string example = "Hey $name! Welcome to $namewebsite!"; 
StringBuilder sb = new StringBuilder(example); 
sb.Replace("$name", "getName()"); 
sb.Replace("$namewebsite", "getWebSiteName()"); 
return sb; 

Над выходом будет «Эй GetName() !, Добро пожаловать на GetName() веб-сайт!», Так что я пытаюсь использовать регулярные выражения, чтобы соответствовать слово целиком.

string example = "Hey $name! Welcome to $namewebsite!"; 
example = Regex.Replace(example, "\b$name\b", "getName()"); 
example = Regex.Replace(example, "\b$namewebsite\b", "getWebSiteName()"); 
return example; 

Но так как «ключевое слово» имеет символ «$» не работает, по крайней мере, это то, что я думаю, потому что она не заменит ни одна из «ключевых слов».

Конечно, это всего лишь небольшой пример моего кода. У меня есть 30+ ключевых слов, начиная с «$», чтобы заменить имена методов.

+0

Вы попробовали экранировать его с помощью '\ $'? – arco444

+0

Положите обратную косую черту перед '' ', чтобы избежать ее, т. Е. Используйте' '\ $" '. Или, альтернативно, 'Regex.Escape (« $ name »)' – CodesInChaos

+0

Когда я использую te Regex.Escape («$ name»), он продолжает заменять сайт $ namewebsite на getName() – Kyore

ответ

1

Проблема здесь не нужно быть решатель с RegEx. Это порядок, в котором вы делаете замены. Это связано с тем, что первый поиск является подстрокой второго. Переключайте их, и это сработает.

string example = "Hey $name! Welcome to $namewebsite!"; 
StringBuilder sb = new StringBuilder(example); 
sb.Replace("$namewebsite", "getWebSiteName()"); 
sb.Replace("$name", "getName()"); 
return sb; 

Рабочий пример: https://ideone.com/kHwHUT

Другой способ решения этой проблемы было бы поставить разделитель в КОНЦЕ строки поиска, а также в начале. Например:

string example = "Hey $name$! Welcome to $namewebsite$!"; 
StringBuilder sb = new StringBuilder(example); 
sb.Replace("$name$", "getName()"); 
sb.Replace("$namewebsite$", "getWebSiteName()"); 
return sb; 
+0

Да, лучшим способом было изменить его положение, Спасибо. – Kyore

0

Символ $ является специальным символом в регулярных выражениях, обозначающим конец строки. Вам нужно сбежать, если вы хотите использовать его как литерал:

Попробуйте использовать \$ вместо $.

Для получения дополнительной информации: http://regexlib.com/CheatSheet.aspx?AspxAutoDetectCookieSupport=1

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