Мне нужно зафиксировать выражение, но только если оно не находится в таблице. Я использую Ruby.
hello.
<p>
<b> 1 capture </b>
</p>
<table class="tb1">
<tr>
<td>
<p>
<b> 1 don't capture </b>
</p>
</td>
</tr>
</table>
<p><strong> 2 capture </strong></p>
<table><tr> <td> <p> <b> 2 don't capture </b> </p> </td> </tr> </table>
<p> <b> 3 don't capture </b> </p> Some text here...
<p> <strong> 4 don't capture </strong> Some text here... </p>
<table fdfdfdfd>
<tr>
<td>
<p> <b> 5 don't capture </b> </p>
</td>
<table>
table...
</table>
</tr>
</table>
Результат должен быть следующим:
<p>
<b> 1 capture </b>
</p>
<p><strong> 2 capture </strong></p>
В настоящее время у меня есть это регулярное выражение: \n\s*<p>\s*<(strong|b)>(?:(?!</\1>).)+</\1>\s*</p>\s*\n
Пробовал просмотр, который исключает выражение, если перед ним есть </table>
и no <table.*>
, Но есть некоторые сложные проблемы с жадными выражениями и проблемами с новой строкой.
Edit: Я знаю, что есть другие способы сделать это, но я должен знать, что это возможно или нет с регулярным выражением.
Да, вы можете выполнить рекурсивное сопоставление регулярных выражений. Здесь один указатель на How: Rexegg regex-recursion. И есть ответ SO для рекурсивного регулярного выражения Ruby