Какое регулярное выражение будет соответствовать вложенной таблице с идентифицируемым текстом в ячейке таблицы?
-
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;