正则表达式:使用否定前瞻匹配无嵌套HTML table标签
匹配无嵌套的HTML table标签
需求说明
要匹配HTML中完整且无嵌套<table>标签的<table>元素:
- 匹配范围从
<table开始,到对应的</table>结束 - 中间内容不能包含任何
<table标签 - 示例中第一个正确匹配是最内层的
<table width=300 border=0 cellspacing=0 cellpadding=0><tr><td>A</td></tr></table>,外层包含嵌套table的不匹配
错误正则分析
你尝试的(<table(?!<table)(.+?)</table>)存在两个问题:
- 仅检查了
<table后面紧跟的内容不是<table,无法限制中间内容里出现<table - 非贪婪匹配
(.+?)会在遇到第一个</table>时停止,但如果这个</table>属于嵌套的table,就会错误匹配不完整的外层table片段
正确正则表达式
使用否定前瞻确保中间内容不包含<table,同时匹配到正确的</table>:
<table(?:(?!<table).)*?</table>
正则解释
<table:匹配table标签的起始部分(?:(?!<table).)*?:非捕获组,匹配任意字符,但每次匹配前会检查当前位置后面不是<table,*?是非贪婪匹配,确保遇到第一个</table>就停止</table>:匹配table标签的结束部分
匹配验证
用你提供的示例HTML测试,该正则会精准匹配所有无嵌套的内层table元素:
- 匹配结果1:
<table width=300 border=0 cellspacing=0 cellpadding=0><tr><td>A</td></tr></table> - 匹配结果2:
<table width=300 border=0 cellspacing=0 cellpadding=0><tr><td>C</td></tr></table> - 匹配结果3:
<table width=300 border=0 cellspacing=0 cellpadding=0><tr><td>E</td></tr></table>
内容的提问来源于stack exchange,提问作者Pixy
相关产品推荐
相关产品推荐

