正则表达式重构 - 搜索匹配,如果找到则将其替换为一行

时间:2013-01-16 12:14:41

标签: c# regex

你好我正在学习正则表达式,我需要你的智力总和来解决这个问题。

我需要知道我是否可以在某个地方搜索某些单词的匹配,如果匹配我将整篇文章与匹配集合进行匹配,然后我在foreach中搜索集合中的每个项目并将该关键字替换为另一个...这段代码工作但我需要知道是否可以在没有foreach的情况下做到这一点,因为它浪费了内存....

MatchCollection mc;
List<string> listek = new List<string>();

Regex r = new Regex(@".*" + word + @".*");

mc = r.Matches(text);
foreach (var item in mc)
{
    listek.Add(Regex.Replace(item.ToString(), word, @"<span class=""highlighted"">" + word + "</span>"));
}

我有以下XML:

<article>
    <title>title 1</title>
    <text>some long text</text>
</article>
<article>
    <title>title 2</title>
    <text>some long text</text>
</article> 

我需要在每个文本节点中搜索关键字,如果我找到匹配,我需要返回文章替换关键字...我的代码出现了但是虚拟方式..(@“。”+ word + @“。”)这意味着我添加到集合全文,但只有包含我的关键字我想在同一时间替换关键字,我不知道如何


我解决了这个问题:

internal static string SearchWordInXml()
{
    var all = from a in WordBase.Descendants("ITEM")
    select new
    {
        title = a.Element("TITLE").Value,
        text = a.Element("TEXT").Value
                  };
        foreach (var d in all)
        {
            Regex r = new Regex(@".*" + service.word + @".*");
            Match v = r.Match(d.text);
            Template();
            var xElemData = TempBase.XPathSelectElement("//DATA");
            if (v.Success)
            {
                XElement elemSet = new XElement("DATASET");
                XElement elemId = new XElement("DATAPIECE");
                XAttribute attId = new XAttribute("ATT", "TITLE");
                XAttribute valueId = new XAttribute("VALUE", d.title);
                elemSet.Add(elemId);
                elemId.Add(attId);
                elemId.Add(valueId);
                XElement elemName = new XElement("DATAPIECE");
                XAttribute attName = new XAttribute("ATT", "TEXT");
                XAttribute valueName = new XAttribute("VALUE", Regex.Replace(d.text, service.word, @"<span class=""highlighted"">" + service.word + "</span>"));
                xElemData.Add(elemSet);
                elemSet.Add(elemName);
                elemName.Add(attName);
                elemName.Add(valueName);
            }
        }
    return convert(TempBase);
}

1 个答案:

答案 0 :(得分:1)

如果您只是查看文本节点,我会考虑使用类似的东西

string text = "<article><title>title 1</title><text>some long text</text></article><article><title>title 2</title><text>some long text</text></article>";
string word = "long";
Regex r = new Regex("(?<=<text>.*?)"+word+"(?=.*?</text>)");
text = r.Replace(text, "<span class=\"highlighted\">$&</span>");

文本现在只包含正确的值。

请注意,$&是对完整匹配的反向引用。如果您要进行任何类型的分组(使用括号()),您可以使用$1$2$3等。

只有一行你可以使用

text = Regex.Replace(text, "(?<=<text>.*?)"+word+"(?=.*?</text>)","<span class=\"highlighted\">$&</span>");