我有一个这样的字符串:
<div>
<query>select * from table1</query>
</div>
<div>
<query>select * from table2</query>
</div>
这是一个模板用例。每个查询将被替换为不同的值(即SQL结果)。是否可以使用Regex Replace方法执行此操作?
我想到的解决方案是在第一遍中使用Regex.Match,收集所有匹配,然后在第二遍中使用string.replace逐个替换匹配。有没有更好的方法来解决这个问题?
答案 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>";
然后用字符串替换方法替换每个匹配