c#委托中的奇怪死循环
本文关键字:循环 | 更新日期: 2023-09-27 18:11:35
我做了一个委托来处理一些html代码。但我只能匹配第一个匹配。但是Match处理程序不会继续。它在第一次匹配时继续循环。有人能告诉我为什么吗?但是为什么我把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>
//.........
您需要将Match.NextMatch
分配给变量。它返回下一个匹配,并且不改变当前的Match
:
m = m.NextMatch();
NextMatch
返回下一个匹配,但您根本不使用其返回值。修改这个,你的代码应该可以工作了:
m = m.NextMatch();
请参阅文档,特别是备注部分中的注释:
此方法不修改当前实例。相反,它返回一个新的Match对象,其中包含有关下一个匹配的信息。
试试改成
while (m.Success)
{
string temp = m.Value;
p(temp, replacement);
m = m.NextMatch();
}