经过双重测试的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而且效果非常好。
如有任何帮助,我们将不胜感激。
我看到两个问题。首先,在正则表达式的开头有^'s+
。在多行模式中,^
与换行后的位置匹配。's+
匹配一个或多个空白字符。但是换行符后面没有任何空白字符。如果您认为行的开头可能有空格或制表符,则应将+
更改为*
;否则,只需丢弃's+
。
其次,正则表达式以$
结尾,它只匹配换行符之前的。但当我从你的帖子中复制文本时,行以'r'n
(回车+换行)结束,而你没有考虑'r
。
当我将^'s+
更改为^
,将$
更改为'r?$
时,我得到了五个匹配。顺便说一下,第二个问题是.NET的错,而不是你的错;多行模式中的$
应在'r
之前匹配,如下所述。
使用此处显示的测试字符串,很明显问题出在下一部分:
's+
这意味着一个或多个符号,并且测试字符串在任何一行之前都没有空白字符。's*
起了作用。