Какое регулярное выражение будет соответствовать вложенной таблице с идентифицируемым текстом в ячейке таблицы? - PullRequest
1 голос
/ 01 октября 2009

Какое регулярное выражение будет соответствовать вложенной таблице с идентифицируемым текстом в ячейке таблицы? Я пытался, но не смог придумать регулярное выражение для извлечения конкретной таблицы, которую я хочу, не беря начало и конец обеих таблиц в примере. Вот что нужно для начала: "<table>.*?</table>"

<table>
    <tr>
        <td>
            <table>
                <tr><td>Code1</td></tr>
                <tr><td>some data</td></tr>
                <tr><td>etc ...</td></tr>
            </table>
        </td>
    </tr>
    <tr>
        <td>
            <table>
                <tr><td>Code2</td></tr>
                <tr><td>some data</td></tr>
                <tr><td>etc ...</td></tr>
            </table>
        </td>
    </tr>
</table>

Скажем, я хочу извлечь таблицу, содержащую "Code2". Какое регулярное выражение будет соответствовать конкретно и только этой таблице?

Ответы [ 3 ]

6 голосов
/ 01 октября 2009

Я бы не использовал регулярное выражение для этого, поскольку HTML не является регулярным, и нет никаких крайних случаев, которые могли бы вас подвести. Вам лучше использовать анализатор HTML. Какой бы язык или платформу вы не использовали, будет доступен один.

4 голосов
/ 01 октября 2009

Следующее регулярное выражение найдет вашу таблицу:

(?ms)<table>((?!<table>).)*<td>Code2</td>.*?</table>

С помощью (?ms) вы включаете «многострочные совпадения» (m) и «точечные совпадения, также новые строки» (s). Тогда у вас будет негативный взгляд (?!), чтобы убедиться, что у вас нет второго начала таблицы внутри вашего матча.

1 голос
/ 01 октября 2009

Не используйте регулярные выражения. Используйте анализатор HTML!

Однако в Perl (при условии, что у вас нет вложенных таблиц):

$xml =~ /<table>.*<td>Code2<\/td>.*<\/table>/s;
...