正则表达式-C#替换SQL通配符

问题描述

我有一些可以与EF Core的EF.Function.Like配合使用的输入。

所以我可能会收到类似%some_text%这样的输入,其中通配符为%_

我需要考虑这一点,并将其提供给另一种不是sql的过滤机制,其中只有*通配符。

因此上述内容将变成*some*text*

但是,sql可以像这样转义其通配符。 %some[_]te_t[%],应转换为*some_te*t%

如何使用C#替换正则表达式?

解决方法

您可以使用2个捕获组并检查例如2组是否具有值。如果不是,则返回第1组的值,该值将捕获方括号之间的值。

由于括号本身是匹配的,因此它们不是替换的一部分。

\[([%_])\]|([%_])

Regex demo | C# demo

示例代码

string[] strings = { 
    "%some_text%","%some[_]te_t[%]"
    };

foreach (String s in strings) {
    var result = Regex.Replace(
        s,@"\[([%_])\]|([%_])",match =>
        match.Groups[2].Success ? "*" : match.Groups[1].Value
    );
    Console.WriteLine(result);
}

输出

*some*text*
*some_te*t%