Regex.Replace 方法 (String, String, MatchEvaluator)
在指定的輸入字符串內,使用 MatchEvaluator 委托返回的字符串替換與指定正則表達式匹配的所有字符串。
命名空間: System.Text.RegularExpressions
程序集: System(System.dll 中)
C#語法
public static string Replace(
string input,
string pattern,
MatchEvaluator evaluator
)
參數
input
要搜索匹配項的字符串。
pattern
要匹配的正則表達式模式。
evaluator
一個自定義方法,該方法檢查每個匹配項,然後返回原始的匹配字符串或替換字符串。
返回值
Type: System.String
一個與輸入字符串基本相同的新字符串,唯一的差別在於,其中的每個匹配字符串已被一個替換字符串代替。如果 pattern 與當前實例不匹配,則此方法返回未更改的當前實例。
ArgumentException
出現正則表達式分析錯誤。
ArgumentNullException
input、pattern 或 evaluator 為 null。
RegexMatchTimeoutException
發生超時。有關超時的更多信息,請參見“備注”節。
備注
Regex.Replace(String, String, MatchEvaluator)方法可用於替換正則表達式匹配,如果任意下列條件為 true:
替換字符串不能輕松地指定由正則表達式替換模式中。
替換字符串的結果與在匹配的字符串上完成某些處理。
替換字符串的結果通過條件處理。
此方法等效於調用Regex.Matches(String, String)方法並將每個傳遞Match在返回的對象MatchCollection集合evaluator委托。
pattern參數包含的符號描述要匹配的字符串的正則表達式語言元素。有關正則表達式的詳細信息,請參閱Регулярные выражения в .NET Framework和正則表達式語言 - 快速參考。
evaluator參數是您定義一個自定義方法的委托的用於檢查每個匹配項。自定義的方法必須具有以下簽名來匹配MatchEvaluator委托。
public string MatchEvaluatorMethod(Match match)
您的自定義方法返回替換了匹配的輸入字符串。
RegexMatchTimeoutException如果替換操作的執行時間超過指定的方法稱為應用程序域的超時間隔,則引發異常。如果沒有超時設置定義在應用程序域的屬性中,或者如果超時值是Regex.InfiniteMatchTimeout,不會引發異常。
因為該方法將返回input保持不變,如果沒有匹配項,您可以使用Object.ReferenceEquals方法,以確定該方法是否已發生任何替換與輸入字符串。
對調用方的說明:
此方法等同於調用它的應用程序域的默認超時值的時間間隔後超時。如果沒有為應用程序域,該值定義超時值Regex.InfiniteMatchTimeout,這樣可以防止否則將會超時,該方法使用。推薦的靜態方法,用於評估和替換模式匹配是Regex.Replace(String, String, MatchEvaluator, RegexOptions, TimeSpan),該對話框允許您設置的超時間隔。
示例
下面的示例使用正則表達式,從字符串中提取各個單詞,然後使用MatchEvaluator要調用一個名為方法委托WordScramble進行加密的單詞中的每個字母。若要這樣做,WordScramble方法創建一個包含匹配項中的字符數組。它還用隨機浮點數創建一個並行的數組,它將填充。這些數組進行排序,通過調用Array.Sort<TKey, TValue>(TKey[], TValue[], IComparer<TKey>)方法,並已排序的數組作為參數提供String類構造函數。然後返回此新創建的字符串WordScramble方法。正則表達式模式\w+匹配一個或多個單詞字符 ;正則表達式引擎將繼續將字符添加到匹配項,直到遇到非單詞字符,例如空格字符。
using System;
using System.Collections;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string words = "letter alphabetical missing lack release " +
"penchant slack acryllic laundry cease";
string pattern = @"\w+";
MatchEvaluator evaluator = new MatchEvaluator(WordScrambler);
Console.WriteLine("Original words:");
Console.WriteLine(words);
Console.WriteLine();
Console.WriteLine("Scrambled words:");
Console.WriteLine(Regex.Replace(words, pattern, evaluator));
}
public static string WordScrambler(Match match)
{
int arraySize = match.Value.Length;
// Define two arrays equal to the number of letters in the match.
double[] keys = new double[arraySize];
char[] letters = new char[arraySize];
// Instantiate random number generator'
Random rnd = new Random();
for (int ctr = 0; ctr < match.Value.Length; ctr++)
{
// Populate the array of keys with random numbers.
keys[ctr] = rnd.NextDouble();
// Assign letter to array of letters.
letters[ctr] = match.Value[ctr];
}
Array.Sort(keys, letters, 0, arraySize, Comparer.Default);
return new String(letters);
}
}
// The example displays output similar to the following:
// Original words:
// letter alphabetical missing lack release penchant slack acryllic laundry cease
//
// Scrambled words:
// elrtte iaeabatlpchl igmnssi lcka aerslee hnpatnce ksacl lialcryc dylruna ecase