我有一個正則表達式用空字符串替換非打印字符。 (在XML文檔中不支持的那些)C# - 在Regex中使用matchTimeout參數。替換
傳入數據的大小非常大,所以如果這個Replace
花費的時間超過幾個毫秒,我想要取消它並返回原始字符串。
下面是我的代碼,但我似乎無法擊中catch
塊,即使我提供了1ms的Timespan
。來自stopwatch
的日誌顯示花費了超過10毫秒。
我在這裏做錯了什麼?
只有當它在給定的時間範圍內沒有找到匹配時,它才能正常工作嗎?
什麼是最好的測試方法?
更新 - 我用一個沒有任何非打印字符的大文件(4 MB)測試了下面的正則表達式。 Regex
花了79毫秒,但沒有例外。
private static string CleanUpNonPrintableCharacters(string incomingString)
{
var stopWatch = new Stopwatch();
try
{
stopWatch.Start();
var timeSpan = TimeSpan.FromMilliseconds(1);
var cleanedUpString = Regex.Replace(incomingString, @"[\u0000-\u0008\u000B\u000C\u000E-\u001F]", string.Empty, RegexOptions.None, timeSpan);
stopWatch.Stop();
Console.Log(stopWatch.ElapsedMilliseconds);
//Above was 79 ms on a file that doesn't have a match, yet no exception was thrown
if (cleanedUpString.Length < incomingString.Length)
{
//do some logging
}
return cleanedUpString;
}
catch (RegexMatchTimeoutException ex)
{
//do some logging
return incomingString;
}
finally
{
//stopWatch.Stop();
//log elapsed
}
}
我想,你的'stopWatch.Stop();'的代碼應該是因爲它似乎只是更換後的代碼在秒錶停止之前還有其他操作。 –
您可以使用委託,然後跟蹤已用時間。如果>限制,可能會在代表內部_throw_內部。不知道這一點(如果正則表達式引擎展開並退出).. – sln
的確,我可以通過用'Task'包裝上述util方法並使用'Timeout'發出'CancellationToken'來解決上述問題,但不知何故,我覺得這應該開箱即用,因爲'Regex.Replace'提供超時選項。 @AkashKC,我用我最近的測試結果更新了我的問題。 – Ren