Многострочный regex - работает в RegexBuddy и онлайн-тестере, но не работает в c # - PullRequest
1 голос
/ 19 октября 2011

У меня есть код на 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

Regex

    @"/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 ]

1 голос
/ 20 октября 2011

Это регулярное выражение дает ожидаемый для меня результат:

@"/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.

0 голосов
/ 19 октября 2011

Везде, где вы ожидаете какой-либо символ новой строки, вы должны использовать '\ s' в своем регулярном выражении. Проверьте аналогичный вопрос и ответ здесь для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...