2015-06-29 3 views
0

У меня есть функция, которая должна заменить любую строку, найденную в другой строке, критериями замены строки, начинающейся с @, и ее нужно заменить только тогда, когда это целое слово.Регулярные выражения заменяют строку, содержащую символ @

Но код ниже не работает. Проблема заключается в характере, @, потому что, если я использую другой символ в начале, например, X, он работает. Однако даже размещение символа @ между квадратными скобками не помогло.

public static string DB_Replace_Str(string st, string stFrom, string stTo) 
{   
    stFrom = stFrom.Replace("@", "[@]");//this does not help 
    string pattern = @"\b" + stFrom + @"\b"; 
    return Regex.Replace(st, pattern, stTo); 
} 

я выкладываю некоторые примеры строк здесь:

+5

Можете ли вы показать образцы строк, которые вы бы проходящими в переменных 'st',' stFrom' и 'stTo', как его написано в настоящее время, очень сложно понять, чего вы пытаетесь достичь. – Nico

+0

Из вашего описания это не похоже на регулярное выражение - это правильная вещь для использования, у C# есть много встроенных способов проверки содержимого строки. – Sayse

+0

Являются ли эти входы?string st = "aaaa @bbb ccc ddd eee fff"; строка stFrom = "bbb"; строка stTo = "XXX"; string ret = "aaaa XXX ccc ddd eee fff"; ? – Wolf5

ответ

0

Вы должны сначала указать границу, не слово, а затем граница слова:

Детали из Regular-Expressions.info:

\b позволяет выполнить «только целые слова» поиск с помощью регулярного выражение в виде \bword\b. «Слово-символ» - это символ, который может использоваться для формирования слов. Все символы, которые не являются «символами слов», являются «символами без слов».
\B является отрицательной версией \b. \B матчей в каждой позиции, где \b нет. Эффективно \B соответствует любой позиции между двумя символами слова, а также в любой позиции между двумя символами, отличными от слова.

public static string DB_Replace_Str(string st, string stFrom, string stTo) 
{ 
    string pattern = string.Format("\\B{0}\\b", stFrom); 
    return Regex.Replace(st, pattern, stTo); 
} 

Или даже:

public static string DB_Replace_Str(string st, string stFrom, string stTo) 
{ 
    return Regex.Replace(st, string.Format("\\B{0}\\b", Regex.Escape(stFrom)), stTo); 
} 

Выход:

SELECT tblSoftware.*, @[email protected] as @TeilId FROM tblSoftware LEFT JOIN @table_Teile ON [email protected] = @[email protected]_Id WHERE [email protected] = 11 
+0

Спасибо, что сработал – fsava

+0

Думаю, мы можем немного улучшить это. Вместо того, чтобы создавать временную переменную, мы можем использовать 'string.Format ...' внутри 'Regex.Replace', и, возможно, нам также следует избегать любых метасимволов внутри' stFrom' с 'Regex.Escape' (хотя, если там это любые несловные символы в конце 'stFrom', мы не получим соответствия :() –

0

Вы должны удалить границы слов. Потому что я думаю, что это не граница слова существует между началом и [

string pattern = @"(?<!\S)" + stFrom + @"(?!\S)"; 

или

string pattern = @"\B" + stFrom + @"\B"; 

Почему это работает, когда вы кладете X в самом начале? Поскольку существует граница между X и [.

+0

Если я удалю границы слов, тогда функция заменит строку также, когда она не будет полной слово (например, часть более длинного слова) – fsava

+0

@fsava проверить мое обновление. –

+0

Я обновил текст моего answe с примерами строк. – fsava

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