正则表达式卡住了一些记录
本文关键字:记录 正则表达式 | 更新日期: 2023-09-27 17:53:06
有时Regex在某些值上卡住了,尽管它对大多数文档都给出了结果。
我说的是当它卡住的时候。
1- collection = Regex.Matches(document, pattern,RegexOptions.Compiled);
2- if (collection.Count > 0) //This Line
{
我调试了解决方案,想在watch窗口中查看集合的值。我看到大多数属性的结果如下:
Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation.
之后在第二行卡住了。
我可以看到正则表达式有一些问题,所以它进入了循环。
问题:我没有得到任何异常,是否有任何方法可以在超时后得到异常,以便我的工具可以继续进行其余的工作。
Regex: @"""price"">(.|'r|'n)*?pound;(?<data>.*?)</span>"
Part of Document : </span><span>1</span></a></li>'n't't't't<li>'n't't't't't<span class='"icon icon_floorplan touchsearch-icon touchsearch-icon-floorplan none'">Floorplans: </span><span>0</span></li>'n't't't't</ul>'n't't</div>'n </div>'n't</div>'n<div class='"details clearfix'">'n't't<div class='"price-new touchsearch-summary-list-item-price'">'r'n't<a href='"/commercial-property-for-sale/property-47109002.html'">POA</a></div>'r'n<p class='"price'">'r'n't't't<span>POA</span>'r'n't't't't</p>'r'n't<h2 class='"address bedrooms'">'r'n't<a id='"standardPropertySummary47109002'"
当Regex搜索需要不合理的长时间时,我如何得到一个异常?
请阅读下面关于在正则表达式搜索中设置超时的内容。
MSDN:正则表达式。MatchTimeout地产
MatchTimeout属性定义了Regex实例在操作超时之前执行单个匹配操作的大约最大时间间隔。正则表达式引擎在超时间隔过后的下一次计时检查中抛出RegexMatchTimeoutException异常。这可以防止正则表达式引擎处理需要过多回溯的输入字符串。有关更多信息,请参见正则表达式中的回溯和. net框架中正则表达式的最佳实践。
public static void Main()
{
AppDomain domain = AppDomain.CurrentDomain;
// Set a timeout interval of 2 seconds.
domain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromSeconds(2));
Object timeout = domain.GetData("REGEX_DEFAULT_MATCH_TIMEOUT");
Console.WriteLine("Default regex match timeout: {0}",
timeout == null ? "<null>" : timeout);
Regex rgx = new Regex("[aeiouy]");
Console.WriteLine("Regular expression pattern: {0}", rgx.ToString());
Console.WriteLine("Timeout interval for this regex: {0} seconds",
rgx.MatchTimeout.TotalSeconds);
}
// The example displays the following output:
// Default regex match timeout: 00:00:02
// Regular expression pattern: [aeiouy]
// Timeout interval for this regex: 2 seconds
为什么我的Regex卡住了?
首先,尝试优化你的Regex,尽可能减少反向引用。斯特里比舍夫的评论有了进步,所以他值得称赞。
的另一件事:你的正则表达式实际上是相当于"价格"> [' s ' s] ?磅;(。 ?) (c#声明:@"价格"> [' s ' s] ?磅;(。 ?)")。因为回溯的次数少得多,所以情况要好得多。——stribizhev Jun 4 at 9:23
其次,如果你遇到特定值的问题,你可以做的第一件事就是跟踪它们,让逻辑每个迭代 (match),而不是用一行代码抓取所有匹配。
MSDN:匹配。NextMatch方法
public static void Main()
{
string pattern = "a*";
string input = "abaabb";
Match m = Regex.Match(input, pattern);
while (m.Success) {
Console.WriteLine("'{0}' found at index {1}.",
m.Value, m.Index);
m = m.NextMatch();
}
}
为了在不使用模式的情况下提高基准性能,通常将Regex对象放在静态类中并只实例化一次,并添加RegexOptions。在实例化它时编译为您的Regex(您已经完成了)。(源)
p。故意造成一个总是可重复的超时是很方便的,也就是无限循环。我将在下面分享。
string pattern = @"/[a-zA-Z0-9]+('[([^]]*(]"")?)+])?$";
string input = "/aaa/bbb/ccc[@x='1' and @y='"/aaa[name='z'] '"]";