你好我正在学习正则表达式,我需要你的智力总和来解决这个问题。
我需要知道我是否可以在某个地方搜索某些单词的匹配,如果匹配我将整篇文章与匹配集合进行匹配,然后我在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);
}
答案 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>");