【问题标题】:Multiline regex- works in RegexBuddy and online tester, but doesn't work in c#多行正则表达式 - 在 RegexBuddy 和在线测试器中有效,但在 c# 中无效
【发布时间】:2011-12-10 12:47:09
【问题描述】:

我有一个 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">

【问题讨论】:

  • 如何描述您的结果与您的预期。
  • 嗨,嘘,我编辑了我的问题...

标签: c# regex multiline


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    在任何需要换行符的地方,都需要在正则表达式中使用“\s”。查看a similar question and answer here了解更多详情。

    【讨论】:

    • 您好 jm2,感谢您的帮助。我尝试使用 /setcard/\?set=([0-9]*).*;" >(.*)$\s.*/msg/\?id=([ 09]*).*ref);">(.*)$\s\s?.*>(.*)$ 并且它仍然可以在线和在 RegexBuddy 中工作,但不是在 c# 中...有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多