1

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

我需要知道我是否可以在某处搜索某个单词的匹配项,如果匹配,我将整篇文章与集合匹配,然后我在集合中的每个项目中搜索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);
}
4

1 回答 1

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>");
于 2013-01-16T12:55:08.013 回答