使用交错数组中的Regex将第一列值替换为第二列值

本文关键字:一列 替换 二列 Regex 数组 | 更新日期: 2023-09-27 18:28:23

在输入字符串中,我想使用下面的Jagged Array将第一列的值替换为以'开头的第二列。例如,a<=bTestc<e变为a'lebTestc'lte。我如何通过编程实现这一点?我使用下面定义的Regex模式,将锯齿状数组的所有第一列元素连接起来,在每个元素之间使用|(Regex"OR")分隔符。我把元素按最大长度到最短长度的顺序连接起来,这样,如果较短的元素包含在较大的元素中,它就不会被替换[参考:示例。我使用的是.NET 4.5.2

string[][] sSymb = { new string[] { "!=", "ne" }, new string[] { "lt=", "leq" }, new string[] { "<", "lt" }, new string[] { ">", "gt" }, new string[] { "<=", "le" }, new string[] { "gt=", "geq" }, new string[] { ">=", "ge" }, new string[] { "!in", "notin" }, new string[] { "sub", "subset" }, new string[] { "sup", "supset" } };
string sPattern = "gt=|!in|sub|sup|!=|<=|lt|>=|<|>";
Regex regex = new Regex(sPattern);
string st = regex.Replace("a<=bcd<e", "''$&"); //this prepends the first column element of array with ' . I need to replace the first column element with ' + second column element 
Console.WriteLine(st);

使用交错数组中的Regex将第一列值替换为第二列值

实现这一点的最简单方法是使用重载for replace,它允许您传入匹配计算器。

string st = regex.Replace("a<=bcd<e", match =>
{
    var matchingSymbol = sSymb.FirstOrDefault(symbol => symbol[0] == match.Value);
    if (matchingSymbol == null)
        throw new Exception("Could not find symbol to exchange.");
    return string.Concat("''",  matchingSymbol[1]);
});

另外,你必须使用锯齿状数组吗?用字典会容易得多。

编辑:刚刚又看了一眼要匹配的钥匙,意识到订单在这里非常重要。您需要确保要替换的条目从最特定到最不特定进行排序(否则正则表达式引擎将匹配"<",而它本可以匹配"&llt;=")。

在这种情况下,有序字典可能是实现这一点的最佳方式:

var sSymb = new System.Collections.Specialized.OrderedDictionary
{
    { "<=", "le" },
    { ">=", "ge" },
    { "!=", "ne" },
    { "<", "lt" },
    { ">", "gt" },
    { "gt=", "geq" }, 
    { "lt=", "leq" },
    { "!in", "notin" }, 
    { "sub", "subset" }, 
    { "sup", "supset" } 
};
var sPattern = sSymb.Keys
    .Cast<string>()
    .Aggregate((left, right) => string.Format("{0}|{1}", left, right));
Regex regex = new Regex(sPattern);
string st = regex.Replace("a<=bcd<e", match => string.Format("''{0}", sSymb[match.Value]));
Console.WriteLine(st);