C# 正则表达式替换,但每次都有不同的替换值

本文关键字:替换 正则表达式 | 更新日期: 2023-09-27 18:35:22

我有一个这样的字符串:

<div>
<query>select * from table1</query>
</div>
<div>
<query>select * from table2</query>
</div>

这是一个模板用例。每个查询将被替换为不同的值(即SQL结果)。是否可以使用正则表达式替换方法来执行此操作?

我正在考虑的解决方案是在第一遍中使用 Regex.Match,收集所有匹配项,然后在第二遍中使用 string.replace 逐个替换匹配项。有没有更好的方法来解决这个问题?

C# 正则表达式替换,但每次都有不同的替换值

var source = 
@"<div>
<query>select * from table1</query>
</div>
<div>
<query>select * from table2</query>
</div>";
var result = Regex.Replace(
   source,
   "(?<=<query>).*?(?=</query>)",
   match => Sql.Execute(match.Value));

Sql.Execute是一个占位符函数,用于调用任何逻辑来执行查询。完成后,其结果将替换原始<query>…</query>内容。

如果要消除查询标记,请使用命名捕获组而不是环顾四周:

var result = Regex.Replace(
    source,
    "<query>(?<q>.*?)</query>",
    match => Sql.Execute(match.Groups["q"].Value));
您可以使用

Html Agility Pack 首先获取 query 标签,并将内部文本替换为您想要的任何内容:

var html = new HtmlDocument();
html.Load(filepath);
var queries = html.DocumentNode.SelectNodes("//query");
foreach(var node in queries)
{
  if(node.InnerText=="select * from table1")
  {
    node.InnerText="your result";
  }
}

您还可以使用字典将模式保存为键,并将替换另存为值:

var dict = new Dictionary<string, string>();
dict.Add("select * from table1","your result");
//...
var html = new HtmlDocument();
html.Load(filepath);
var queries = html.DocumentNode.SelectNodes("//query");
foreach(var node in queries)
{
  if(dict.Keys.Contains(node.InnerText))
  {
    node.InnerText=dict[node.InnerText];
  }
}

我们知道正则表达式不适合 html 解析,但我认为你不需要在这里解析 html,而只需获取模式<query>xxx</query>内容即可。因此,文档的其余部分是什么并不重要,因为您不想遍历它,也不想验证或更改,什么都不想(根据您的问题)。

因此,在这种特殊情况下,我会更多地使用正则表达式而不是html解析器:

var pattern = "<query>.+<'/query>";

然后用字符串替换方法替换每个匹配项