多行regex-在RegexBuddy和在线测试器中工作,但在c#中不起作用

时间:2011-10-18 23:42:11

标签: c# regex multiline

我有一个c#代码,一个正则表达式和HTML源文件。它在RegexBuddy和http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx中工作正常,但在Visual Studio中没有。请帮忙解释一下我的错误。

我的期望是:

找到3场比赛:

/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username</a></td> <td bgcolor="#F6F6F6"><a href="../../msg/?id=49244417" onclick="return openUrl(this.href);">Message1 example text</a></td> <td bgcolor="#F6F6F6">16.10.11 23:20</td> has 5 groups:
    1. 4387740
    2. Username
    3. 49244417
    4. Message1 example text
    5. 16.10.11 23:20
/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username2</a></td> <td><a href="../../msg/?id=49223017" onclick="return openUrl(this.href);">Message2 example text</a></td> <td>16.10.11 14:42</td> has 5 groups:
    1. 4387740
    2. Username2
    3.49223017
    4. Message2 example text
    5. 16.10.11 14:42
/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username3</a></td> <td bgcolor="#F6F6F6"><a href="../../msg/?id=49222720" onclick="return openUrl(this.href);">Message3 example text</a></td> <td bgcolor="#F6F6F6">16.10.11 14:34</td> has 5 groups:
    1. 4387740
    2. Username3
    3. 49222720
    4. Message3 example text
    5. 16.10.11 14:34

正则表达式

    @"/setcard/\?set=([0-9]*).*;"" >(.*)</a></td>$\s.*/msg/\?id=([0-9]*).*ref\);"">(.*)</a></td>$\s\s?.*>(.*)</td>$"

C#代码

using (StreamReader rdr = File.OpenText("file.html"))
        { s = rdr.ReadToEnd(); }

        Regex listMsgs = new Regex(@"/setcard/\?set=([0-9]*).*;"".>(.*)</a></td>$
.*/msg/\?id=([0-9]*).*ref\);"">(.*)</a></td>$

?.*>(.*)</td>$", RegexOptions.Multiline);
        Match m = listMsgs.Match(s);
        while (m.Success)
        {}

HTML来源

        <td bgcolor="#F6F6F6" class="c1"><IMG BORDER="0" SRC="transparent.gif" width="15px" height="15px" /></td>
        <td bgcolor="#F6F6F6" style="width:108px"><a href="../../auswertung/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username</a></td>
        <td bgcolor="#F6F6F6"><a href="../../msg/?id=49244417" onclick="return openUrl(this.href);">Message1 example text</a></td>
        <td bgcolor="#F6F6F6">16.10.11 23:20</td>
        <td bgcolor="#F6F6F6">
                    </td>
        <td bgcolor="#F6F6F6" align="center">

        <img src="message_art1.gif" width="14" height="10" border="0" />            </td>
        <td bgcolor="#F6F6F6"><input type="checkbox" name="messages[]" id="id_msg_1" value="49244417"></td>
        </tr>
                                <tr height="20">
        <td class="c1"><IMG BORDER="0" SRC="transparent.gif" width="15px" height="15px" /></td>
        <td style="width:108px"><a href="../../auswertung/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username2</a></td>
        <td><a href="../../msg/?id=49223017" onclick="return openUrl(this.href);">Message2 example text</a></td>

        <td>16.10.11 14:42</td>
        <td>
                    </td>
        <td align="center">
        2           </td>
        <td><input type="checkbox" name="messages[]" id="id_msg_2" value="49223017"></td>
        </tr>
                                <tr height="20">

        <td bgcolor="#F6F6F6" class="c1"><IMG BORDER="0" SRC="transparent.gif" width="15px" height="15px" /></td>
        <td bgcolor="#F6F6F6" style="width:108px"><a href="../../auswertung/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username3</a></td>
        <td bgcolor="#F6F6F6"><a href="../../msg/?id=49222720" onclick="return openUrl(this.href);">Message3 example text</a></td>
        <td bgcolor="#F6F6F6">16.10.11 14:34</td>
        <td bgcolor="#F6F6F6">
                    </td>
        <td bgcolor="#F6F6F6" align="center">

        2           </td>
        <td bgcolor="#F6F6F6"><input type="checkbox" name="messages[]" id="id_msg_3" value="49222720"></td>
        </tr>
                                <tr height="20">

2 个答案:

答案 0 :(得分:1)

这个正则表达式为我产生了预期的结果:

@"/setcard/\?set=([0-9]*).*?;""\s*>(.*?)</a></td>\s*.*?/msg/\?id=([0-9]*).*?ref\);"">(.*?)</a></td>\s*.*>(.*?)</td>"

看起来您正在使用$元字符来匹配换行符,这是不正确的。这是一个零宽度断言:它在换行之前匹配的位置,而不消耗换行符。这意味着.*之后的$必须使用它,但当然点与新行不匹配。

在这种情况下使用锚点($)确实没有意义;你必须使用换行符,所以只要匹配任何其他字符就可以匹配它们。如果换行符 required ,我建议使用[\r\n]+,它将匹配任何类型的换行符中的一个或多个,无论它们是\r\n(DOS / Windows样式), \r(OSX之前的Mac)或\n(其他所有内容)。但在这种情况下,我认为你不需要那么具体; \s*(任何空格字符中的零个或多个)似乎工作正常。您也不再需要Multiline选项。

答案 1 :(得分:0)

您期望任何类型的换行符,您需要在正则表达式中使用'\ s'。查看a similar question and answer here了解详情。