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

我需要转义用户输入的字符串中的 % 个字符 - 用 [%] 替换它们 除非它们在开头或字符串的结尾。

例如 %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]);

-或-

进行基于 token 的三遍替换,例如

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

最佳答案

你可以试试:

(?<!^)((?<!\[)|(?!.\]))%(?!$)

它有点难看,因为我希望它匹配 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.Replace(input, @"(?<!^)((?<!\[)|(?!.\]))%(?!$)", x => "[" + x + "]")

https://stackoverflow.com/questions/5967542/

相关文章:

c# - 如何访问 foreach 之外的变量 (C#)

php - 尝试在 php 中为在线商店实现促销代码框

php - 如何确定哪些脚本正在使用 fopen?

sql-server - SQL Server 复制数据库问题

.net - "Statement is not valid in a namespace"错误信息

php - 在 url mod_rewrite 中隐藏扩展名 .php

performance - C# 和 C++ 可以互操作高性能代码吗?

asp.net - ObjectDataSource 没有要插入的值

php - 在 PHP5 的 _destruct 中自动取消设置所有类变量

qt - PyQt - 如何导入 .qss 文件?