在替换部分正则表达式匹配之前处理它



我正在编写一个函数,它将解析一个类似于遗留系统中的XML文件的文件。

....
<prod pid="5" cat='gov'>bla bla</prod>
.....
<prod cat='chi'>etc etc</prod>
....
.....

我现在有这个代码:

buf = Regex.Replace(entry, "<prod(?:.*?)>(.*?)</prod>", "<span class='prod'>$1</span>");

在决定我们还想显示类别之前,它工作得很好。

问题是,类别是可选的,我需要通过SQL查询运行类别缩写来检索类别的全名。

,

SELECT * FROM cats WHERE abbr='gov'

最终输出应该是:

<span class='prod'>bla bla</span><span class='cat'>Government</span>

我该怎么做呢?

注1:该功能已经完成(除了这一部分),并工作良好。注2:不能使用XML库,必须使用regex

Regex.Replace有一个过载,它接受一个MatchEvaluator,这基本上是一个Func<Match, string>。因此,您可以动态地生成一个替换字符串。

buf = Regex.Replace(entry, @"<prod(?<attr>.*?)>(?<text>.*?)</prod>", match => {
    var attrText = match.Groups["attr"].Value;
    var text = match.Groups["text"].Value;
    // Now, parse your attributes
    var attributes = Regex.Matches(@"(?<name>w+)s*=s*(['""])(?<value>.*?)1")
                          .Cast<Match>()
                          .ToDictionary(
                               m => m.Groups["name"].Value,
                               m => m.Groups["value"].Value);
    string category;
    if (attributes.TryGetValue("cat", out category))
    {
        // Your SQL here etc...
        var label = GetLabelForCategory(category)
        return String.Format("<span class='prod'>{0}</span><span class='cat'>{1}</span>", WebUtility.HtmlEncode(text), WebUtility.HtmlEncode(label));
    }
    // Generate the result string
    return String.Format("<span class='prod'>{0}</span>", WebUtility.HtmlEncode(text));
});

最新更新