這應該做到這一點。
int count = 0;
string text = Regex.Replace(text,
@"(((http|ftp|https):\/\/|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)", //Example expression. This one captures URLs.
match =>
{
string replacementValue = String.Format("<a href='{0}'>{0}</a>", match.Value);
count++;
return replacementValue;
});
我不是我開發的計算機上,所以我不能現在就做,但我將稍後進行試驗,看看是否有一種方法與lambda表達式要做到這一點,而不是聲明方法IncrementCount()僅用於增加一個int。
EDIT修改爲使用lambda表達式而不是聲明另一個方法。
EDIT2如果您事先不知道該模式,您仍然可以獲取匹配對象中的所有分組(您引用的$組),因爲它們包含在GroupCollection中。像這樣:
int count = 0;
string text = Regex.Replace(text,
@"(((http|ftp|https):\/\/|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)", //Example expression. This one captures URLs.
match =>
{
string replacementValue = String.Format("<a href='{0}'>{0}</a>", match.Value);
count++;
foreach (Group g in match.Groups)
{
g.Value; //Do stuff with g.Value
}
return replacementValue;
});
這是一個簡單的命令行工具,可以用任何正則表達式搜索調用,並將模式替換爲命令行參數。因此理想的情況是需要一種通用的解決方案,不要提前知道該模式。真的,這是爲了興趣 - 在.Net中做這件事的最好方法是什麼?看起來像手動分析$替換的MatchEvaluator方法是前進的方向,但它有點凌亂:( – 2011-02-14 16:50:42
西蒙,看我的編輯。 – Chev 2011-02-14 16:56:36