使用交错数组中的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);
实现这一点的最简单方法是使用重载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);