我有一个函数应该替换在另一个字符串中找到的任何字符串,其条件是要替换的字符串以@
开头,并且只有当它是整个单词时才必须替换它。
但是下面的代码不起作用。问题在于字符@
,因为如果我在开头使用另一个字符,例如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);
}
我在这里发布一些示例字符串:
st
= "SELECT @table_Software.*, @table_Teile.@Id as @TeilId FROM @table_Software LEFT JOIN @table_Teile ON @table_Software.@Id = @table_Teile.@Software_Id WHERE @table_Software.@Id = 11"
stFrom
= "@table_Software"
stTo
= "tblSoftware"
答案 0 :(得分:0)
您需要删除字边界。因为我认为起点与string pattern = @"(?<!\S)" + stFrom + @"(?!\S)";
string pattern = @"\B" + stFrom + @"\B";
或
X
为什么在开始时放置X
时它会起作用?因为[
和{{1}}之间存在单词边界。
答案 1 :(得分:0)
您需要先指定非单词边界,然后指定单词边界:
来自Regular-Expressions.info的详细信息:
\b
允许您仅执行&#34;整个单词&#34;使用\bword\b
形式的正则表达式进行搜索。一个&#34;字符&#34;是一个可以用来形成单词的字符。所有不是&#34;字符的字符&#34;是&#34;非单词字符&#34;。
\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.*, @table_Teile.@Id as @TeilId FROM tblSoftware LEFT JOIN @table_Teile ON tblSoftware.@Id = @table_Teile.@Software_Id WHERE tblSoftware.@Id = 11