.net 转义中间字符串百分比符号,正则表达式是最好的选择吗?

.net 转义中间字符串百分比符号,正则表达式是最好的选择吗?,.net,regex,.net,Regex,我需要对用户输入的字符串中的%字符进行转义-将它们替换为[%],除非它们位于字符串的开头或结尾 例如,%foo%foo[%]foo%应该变成%foo[%]foo[%]foo%。空白不是一个问题:这都是关于转义任何中间字符串百分比符号 [^[]%[^\]]的正则表达式将匹配中间字符串百分比,但也匹配相邻字符(在我的示例中是o%f) 是否有一个合理的正则表达式只匹配中间字符串的非转义百分比字符 我想知道非正则表达式解决方案是否更可取,例如 遍历字符串中的字符,并使用转义的百分比构建替换字符串 con

我需要对用户输入的字符串中的
%
字符进行转义-将它们替换为
[%]
,除非它们位于字符串的开头或结尾

例如,
%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]);
(虽然这也将转义任何第一个或最后一个字符的百分比,这不是我想要的)


至于我为什么需要这样做-我正在转义用户输入的、应用于
数据表的
过滤表达式值,如果您将regex的元素放在括号中,您将得到一组匹配的组,您可以使用在regex replace函数中通过数字引用这些组

然后,您可以执行类似于
(.%)()
的正则表达式,并获得命名组
$1
$2
$3
。然后,您可以在替换字符串中使用
$1
$3
,将原来的字符放回原处

有关如何在regex replace中使用命名组的信息,请参阅。(在.NET上有具体信息)

希望有帮助

(\w)%(\w)

使用此选项,然后替换为
$1[%]$2
。这应该能奏效。它会将任何
%
的两边都匹配一个单词字符(基本上是字母数字)。

这个正则表达式似乎可以做到这一点:
[^[](?%)[^]

[^[]
表示与
[
不匹配的字符

(?%)
表示与
%

[^]]
表示与
]
不匹配的字符


基本上与正则表达式相同,只是内部%位于命名捕获组中,因此您可以轻松获取其位置。

您希望转义包含SQL通配符的用户输入文本,因为您将在SQL查询中使用该值作为
LIKE
子句的目标,对吗

在这种情况下,您还必须查看

  • %
    (匹配零个或多个字符
  • (匹配1个字符)
  • […](匹配字符集)
  • [^…](匹配字符集)

首先禁止用户输入通配符不是很容易吗?

看看这个代码示例:

string resultString = null;
try {
    resultString = Regex.Replace("%fooo[%foo%]foo[%]foo%", @"(?!^)(\[?%(?!\])|(?<!\[)%\]?)(?!$)", "[%]");
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}
string resultString=null;
试一试{
resultString=Regex.Replace(“%fooo[%foo%]foo[%]foo%”,@“(?!^)(\[?%(?!\])))|(?您可以尝试:

(?<!^)((?<!\[)|(?!.\]))%(?!$)
(?
这有点难看,因为我想让它与案例foo[%foo和foo%]foo匹配

(?<!^) - Prevents match at start of string (negative look behind)
(?!$) - Prevents match at end of a string (negative look ahead)
(?<!\[)|(?!.\]) - Prevents a match if previous is '[' AND ']' is next.  
(?
您可以将其与Regex命令一起使用,如:

Regex.Replace(input, @"(?<!^)((?<!\[)|(?!.\]))%(?!$)", x => "[" + x + "]")

Regex.Replace(input,@)(?
将不起作用,因为它将匹配空格-我相信这是不需要的。我不关心空格,并相应地更新了问题。
将匹配
[
]
字符,我认为op所说的是不需要的。我的观点是关于使用括号来组成命名组,而不是括号的内容。op已经有了一个与他想要的模式匹配的正则表达式;我只是在示例中使用了点来简化它,以使括号的使用更清晰。这也将具有重叠匹配项的il:
a%b%c
->
a[%]b%c
。如果存在空格(或空白),则此操作无效这是我的初衷,但我把问题看错了,后来问题被澄清了。这个正则表达式还匹配了
%
左右的字符,这是我原来正则表达式的关键问题。我确实考虑过使用捕获组,但不确定如何在使用.NET正则表达式类。$group name是您在替换操作中引用捕获组的方式。在这种情况下:
$Token
是的,这会更简单,但在我的场景中,这不是一个选项,因为用户需要能够在筛选器值中指定百分号。感谢您用正则表达式各部分的含义的细分补充您的答案。
Regex.Replace(input, @"(?<!^)((?<!\[)|(?!.\]))%(?!$)", x => "[" + x + "]")