c#regex替换,但每次都有不同的替换值

时间:2016-02-19 21:03:04

标签: c# regex

我有一个这样的字符串:

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

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

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

3 个答案:

答案 0 :(得分:2)

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));

答案 1 :(得分:1)

您可以使用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];
  }
}

答案 2 :(得分:0)

我们知道正则表达式不适合html解析,但我认为你不需要在这里解析html,而只是简单地得到<query>xxx</query>模式中的内容。 因此,如果您不想遍历它,也不想验证或更改任何内容(根据您的问题),那么文档的其余部分并不重要。

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

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

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