我需要转义%字符在由用户输入的字符串中 - 用[%]取代它们,除非它们位于字符串的开始或结尾。转义中间字符串百分号,是一个正则表达式的最佳选择?
例如%foo%foo[%]foo%应该变成%foo[%]foo[%]foo%。空白不是一个问题:这完全是为了逃避任何中间字符串的百分号。
[^[]%[^\]]的正则表达式将匹配中间字符串百分比,但也会匹配相邻字符(在我的示例中为o%f)。
是否有一个合理的正则表达式,只匹配中间字符串的非转义百分比字符?
我想知道如果一个非正则表达式的解决方案将通过字符串中的字符是优选的,如
迭代,并建立一个替换字符串与百分比转义
const string TEST = "%foo%foo[%]foo%";
StringBuilder escaped = new StringBuilder();
escaped.Append(TEST[0]);
for (int i = 1; i < TEST.Length - 1; i++)
{
if (TEST[i] != '%' || (TEST[i - 1] == '[' && TEST[i] == '%' && TEST[i + 1] == ']'))
{
escaped.Append(TEST[i]);
}
else
{
escaped.Append("[%]");
}
}
escaped.Append(TEST[TEST.Length - 1]);
-OR -
做一个三通道的基于令牌的置换如
const string TOKEN = "!PERCENT!"; // a string which we hope(!) we will never encounter in the string we're escaping
const string TEST = "%foo%foo[%]foo%";
string escaped = TEST.Replace("[%]", TOKEN);
escaped = replaced.Replace("%", TOKEN);
escaped = replaced.Replace(TOKEN, "[%]");
(虽然这也将难逃任何第一个或最后一个字符的百分比,这是不是我想要的)
至于我为什么要做这个 - 我逃避由要用户输入Like过滤器表达式的值适用于DataTable。