2

HTML コードを処理するデリゲートを作成しました。しかし、私は最初の一致しか一致できません。しかし、Match ハンドラーは続行しません。最初の一致でループし続けます。誰でも理由を教えてもらえますか? しかし、デリゲートの外側にある while ループを移動した理由は、すべて問題ありません。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
namespace migration
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "<a class=\"normal\" href=\"http://msdn.microsoft.com/\" title=\"Home\">Home</a><a class=\"active\" href=\"http://msdn.microsoft.com/library/default.aspx\" title=\"Library\">Library</a><a class=\"normal\" href=\"http://msdn.microsoft.com/bb188199\" title=\"Learn\">Learn</a><a class=\"normal\" href=\"http://code.msdn.microsoft.com/\" title=\"Samples\">Samples</a><a class=\"normal\" href=\"http://msdn.microsoft.com/aa570309\" title=\"Downloads\">Downloads</a><a class=\"normal\" href=\"http://msdn.microsoft.com/hh361695\" title=\"Support\">Support</a><a class=\"normal\" href=\"http://msdn.microsoft.com/aa497440\" title=\"Community\">Community</a><a class=\"normal\" href=\"http://social.msdn.microsoft.com/forums/en-us/categories\" title=\"Forums\">Forums</a>";


            HTMLStringWalkThrough(input, "<a.+?</a>", "", PrintTest);


        }
        public static string HTMLStringWalkThrough(string HTMLString, string pattern, string replacement, HTMLStringProcessDelegate p)
        {
            StringBuilder sb = new StringBuilder();
            Match m = Regex.Match(HTMLString, pattern);

            while (m.Success)
            {
                string temp = m.Value;
                p(temp, replacement);
                m.NextMatch();
            }
            return sb.ToString();
        }
        public delegate void HTMLStringProcessDelegate(string input, string replacement);
        static void PrintTest(string tag, string replacement)
        {
            Console.WriteLine(tag);
        }
    }
}
//output:
//<a class=\"normal\" href=\"http://msdn.microsoft.com/\" title=\"Home\">Home</a>
//<a class=\"normal\" href=\"http://msdn.microsoft.com/\" title=\"Home\">Home</a>
//<a class=\"normal\" href=\"http://msdn.microsoft.com/\" title=\"Home\">Home</a>
//<a class=\"normal\" href=\"http://msdn.microsoft.com/\" title=\"Home\">Home</a>
//<a class=\"normal\" href=\"http://msdn.microsoft.com/\" title=\"Home\">Home</a>
//<a class=\"normal\" href=\"http://msdn.microsoft.com/\" title=\"Home\">Home</a>
//<a class=\"normal\" href=\"http://msdn.microsoft.com/\" title=\"Home\">Home</a>
//.........
4

3 に答える 3

4

変数に割り当てる必要がありMatch.NextMatchます。次の一致を返し、現在の を変更しませんMatch:

 m = m.NextMatch();
于 2013-04-29T15:34:44.923 に答える
4

NextMatch次の一致を返しますが、その戻り値をまったく使用しません。これを変更すると、コードが機能するはずです。

m = m.NextMatch();

ドキュメントを参照してください。具体的には、備考セクションの注を参照してください。

このメソッドは、現在のインスタンスを変更しません。代わりに、次の一致に関する情報を含む新しい Match オブジェクトを返します。

于 2013-04-29T15:35:01.680 に答える
1

に変更してみてください

        while (m.Success)
        {
            string temp = m.Value;
            p(temp, replacement);
            m = m.NextMatch();
        }
于 2013-04-29T15:36:20.427 に答える