比如这样的 html table 代码
<table>
<tr>
<td>test1</td>
<td>test2</td>
<td>test3</td>
<td>test4</td>
</tr>
<tr>
<td>test5</td>
<td>www.cnblogs.com</td>
<td>test6</td>
<td>test7</td>
</tr>
<tr>
<td>test8</td>
<td>test9</td>
<td>test10</td>
<td>test11</td>
</tr>
<tr>
</table>
如果使用下面的正则表达式
<tr[^>]*>[\s\S]*?cnblogs[\s\S]*?</tr>
会匹配出下面的内容,多匹配了一个 <tr>
块
<tr>
<td>test1</td>
<td>test2</td>
<td>test3</td>
<td>test4</td>
</tr>
<tr>
<td>test5</td>
<td>www.cnblogs.com</td>
<td>test6</td>
<td>test7</td>
</tr>
参考 stackoverflow 上的回答,通过 negative lookahead (?!</tr>)
解决了
<tr[^>]*>([\s\S](?!</tr>))*cnblogs[\s\S]*?</tr>