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

1行だけにするために使用できます

text = Regex.Replace(text, "(?<=<text>.*?)"+word+"(?=.*?</text>)","<span class=\"highlighted\">$&</span>");
于 2013-01-16T12:55:08.013 に答える