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

StackOverflow https://stackoverflow.com/questions/1505277

  •  19-09-2019
  •  | 
  •  

Вопрос

Какое регулярное выражение будет соответствовать вложенной таблице с идентифицируемым текстом в ячейке таблицы?Я пытался, но не смог придумать регулярное выражение для извлечения конкретной таблицы, которую я хочу, без захвата начала и конца обеих таблиц в примере.Вот кое-что, с чего можно начать:"<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".Какое регулярное выражение будет соответствовать конкретно и только этой таблице?

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

$xml =~ /<table>.*<td>Code2<\/td>.*<\/table>/s;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top