عبارات باقاعده و نیاز به Timeout
نویسنده: وحید نصیری
تاریخ: ۱۳۹۰/۱۲/۲۳ ۱۸:۴۱:۰۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
using System;
using System.Text.RegularExpressions;
namespace RegexLoop
{
class Program
{
static void Main(string[] args)
{
var emailAddressRegex = new Regex(@"^[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\@[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\.[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*$|^$");
if (emailAddressRegex.IsMatch("an.infinite.loop.sample.just_for.test"))
{
Console.WriteLine("Matched!");
}
var input = "The quick brown fox jumps";
var pattern = @"([a-z ]+)*!";
if (Regex.IsMatch(input, pattern))
{
Console.WriteLine("Matched!");
}
}
}
}using System;
using System.Text.RegularExpressions;
using System.Threading;
namespace RegexLoop
{
public static class TimedRunner
{
public static R RunWithTimeout<R>(Func<R> proc, TimeSpan duration)
{
using (var waitHandle = new AutoResetEvent(false))
{
var ret = default(R);
var thread = new Thread(() =>
{
ret = proc();
waitHandle.Set();
}) { IsBackground = true };
thread.Start();
bool timedOut = !waitHandle.WaitOne(duration, false);
waitHandle.Close();
if (timedOut)
{
try
{
thread.Abort();
}
catch { }
return default(R);
}
return ret;
}
}
}
class Program
{
static void Main(string[] args)
{
var emailAddressRegex = new Regex(@"^[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\@[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\.[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*$|^$");
if (TimedRunner.RunWithTimeout(
() => emailAddressRegex.IsMatch("an.infinite.loop.sample.just_for.test"),
TimeSpan.FromSeconds(2)))
{
Console.WriteLine("Matched!");
}
var input = "The quick brown fox jumps";
var pattern = @"([a-z ]+)*!";
if (TimedRunner.RunWithTimeout(() => Regex.IsMatch(input, pattern), TimeSpan.FromSeconds(2)))
{
Console.WriteLine("Matched!");
}
}
}
}AppDomain.CurrentDomain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromMicroseconds(50)); Regex.IsMatch("abc", "a", RegexOptions.None, TimeSpan.FromSeconds(5)); public static class TimeoutExtensions
{
private static void ExecuteTimeoutCommon(Task actionTask, TimeSpan maxDelay)
{
var delayTask = Task.Delay(maxDelay);
var finishedTaskIndex = Task.WaitAny(actionTask, delayTask);
if (finishedTaskIndex != 0)
{
throw new TimeoutException("Action did not finish in the desired time slot.");
}
}
public static void ExecuteTimeout<T>(Func<T> func, TimeSpan maxDelay)
{
var executionTask = Task.Run(() =>
{
func();
});
ExecuteTimeoutCommon(executionTask, maxDelay);
}
public static void ExecuteTimeout(Action action, TimeSpan maxDelay)
{
var executionTask = Task.Run(() =>
{
action();
});
ExecuteTimeoutCommon(executionTask, maxDelay);
}
} TimeoutExtensions.ExecuteTimeout(Console.ReadLine, TimeSpan.FromSeconds(3));