经过双重测试的Regex在运行时不起作用

本文关键字:运行时 不起作用 Regex 测试 经过 | 更新日期: 2023-09-27 18:20:31

我已经挣扎了一天多,我认为这是一件容易的事情。

我需要解析页面的HTML来查找一些结构化数据。

这是测试字符串:

<option value="0794">0794 - SANTA MARIA</option>
<option value="0795">0795 - ALICE COUTINHO</option>
<option value="0800">0800 - T.LARANJEIRAS (CIRCULAR A E B) - VIA T. CARAPINA/J. CAMBURI</option>
<option value="0801">0801 - T. LARANJEIRAS / T. CARAPINA - VIA VALPARAISO / J. LIMOEIRO</option>
<option value="0802">0802 - DIVINOPOLIS / T.LARANJEIRAS VIA CENTRO DA SERRA</option>

这是Regex模式:

^'s+<option value="'d+">(?<linha>'d+) - (?<nome>(.*?))</option>$

使用Visual Studio 2010进行调试时,找不到匹配项。

完整代码:

var pattern = @"^'s+<option value=""'d+"">(?<linha>'d+) - (?<nome>(.*?))</option>$";
var regex = new Regex(pattern, RegexOptions.Multiline);
var matches = regex.Matches(html)

html是测试字符串,而matches.Count总是0

我已经测试过了http://regexhero.net/tester/和http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx而且效果非常好。

如有任何帮助,我们将不胜感激。

经过双重测试的Regex在运行时不起作用

我看到两个问题。首先,在正则表达式的开头有^'s+。在多行模式中,^与换行后的位置匹配。's+匹配一个或多个空白字符。但是换行符后面没有任何空白字符。如果您认为行的开头可能有空格或制表符,则应将+更改为*;否则,只需丢弃's+

其次,正则表达式以$结尾,它只匹配换行符之前的。但当我从你的帖子中复制文本时,行以'r'n(回车+换行)结束,而你没有考虑'r

当我将^'s+更改为^,将$更改为'r?$时,我得到了五个匹配。顺便说一下,第二个问题是.NET的错,而不是你的错;多行模式中的$应在'r之前匹配,如下所述。

使用此处显示的测试字符串,很明显问题出在下一部分:

's+

这意味着一个或多个符号,并且测试字符串在任何一行之前都没有空白字符。's*起了作用。