簡體   English   中英

多行正則表達式可在RegexBuddy和在線測試儀中使用,但不適用於c#

[英]Multiline regex- works in RegexBuddy and online tester, but doesn't work in c#

我有一個ac#代碼,一個正則表達式和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">

這個正則表達式為我產生了預期的結果:

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

看來您正在使用$元字符來匹配換行符,這是不正確的。 這是一個零寬度的斷言:它與換行符之前的位置匹配,而不會消耗換行符。 這意味着$后面的.*必須使用它,但是當然點與換行符不匹配。

在這種情況下,使用錨點( $ )確實沒有意義; 無論如何,您都必須使用換行符,因此只需按照匹配其他任何字符的方式進行匹配即可。 如果需要換行符,我建議使用[\\r\\n]+ ,它將匹配任何一種或多種換行符,無論它們是\\r\\n (DOS / Windows風格), \\r (OSX之前的版本) Mac)或\\n (其他所有字符)。 但是在這種情況下,我認為您不需要這么具體; \\s* (零個或多個空格字符)似乎可以正常工作。 您也不再需要“ Multiline選項。

在任何需要換行符的地方,都需要在正則表達式中使用“ \\ s”。 請查看類似的問題,然后在此處回答以獲取更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM