ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用正则表达式精确匹配完整 HTML 标签:以 `<style>` 标签实战解读 Alternation 与边界控制

用正则表达式精确匹配完整 HTML 标签:以 `<style>` 标签实战解读 Alternation 与边界控制 文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载本指南基于 Modern JavaScript Tutorial 中正则表达式OR分支章节的实战任务Find the full tag展开讲解如何写出一个既能匹配style、style type... id...等完整标签、又绝不误伤styler这类形似标签的正则表达式。读完本文你将掌握 alternation|的优先级陷阱、\s空白类与*?惰性量词的组合用法以及用结尾边界约束模式匹配范围的通用思路可直接迁移到任何 HTML 标签或同类结构化文本的提取场景。任务背景匹配完整标签而非形似的单词在 13-regexp-alternation 章节的 04-match-exact-tag 任务 中要求写出一个正则表达式来查找style...完整标签它应该匹配无属性的style匹配带多个属性的style type... id...绝不能匹配styler这种恰好以style开头的词。验证示例let regexp /your regexp/g; alert( style styler style test....match(regexp) ); // 期望结果style, style test...任务的核心难点在于完整标签的边界定义style只是前缀必须进一步确认紧随其后的字符是标签结尾或空白字符开头的属性区而不是普通字母。这正是 alternation 擅长解决的场景。误区一style.*?为什么不行看到匹配任意内容到第一反应通常是惰性点号写法pattern:style.*?。把它套进示例字符串验证let regexp /style.*?/g; alert( style styler style test....match(regexp) ); // 输出style, styler, style test...结果把styler也匹配进来了。原因很直观.匹配除换行外的任意字符style之后的r也是任意字符于是styler前缀加惰性.*?加就恰好构成一个完整标签。如 solution.md 所指出不能简单地写style.*?因为match:styler会被它匹配到。这说明点号任意字符的语义在此处过宽——我们需要的是空白字符而不是任意字符。误区二只用\s覆盖属性为什么还不够沿着属性前必须是空白的思路可以构造出pattern:style\s.*?。它的含义是style后必须紧跟一个空白字符然后惰性匹配到let regexp /style\s.*?/g; alert( style styler style test....match(regexp) ); // 输出style test...只匹配到带属性的那个这个写法成功排除了stylerr不是空白字符但同时也丢掉了无属性的style——因为style中style之后紧跟的是而不是空白。可见属性前必须是空白和标签直接结束是两种并列的合法结尾恰好需要 alternation 把它们组织成二者之一。正解alternation 组合两种合法结尾正确方案来自 solution.md把两种结尾用|分支并放在括号里let regexp /style(|\s.*?)/g; alert( style styler style test....match(regexp) ); // 输出style, style test...逐段拆解这个模式模式片段含义style字面匹配标签前缀(分组开始限定 alternation 的作用范围分支一无属性标签style后直接是\|alternationOR二选一\s分支二属性区必须以空白字符开头空格、\t、换行等见 02-regexp-character-classes 章节 对\s的定义.*?惰性量词尽可能少地匹配任意字符直到满足后续部分属性区扫描的终止符)分组结束g全局标志返回所有匹配两个分支分别对应标签直接闭合与空白起头的属性区styler里r既不是也不是\s两个分支都不成立自然被排除。原理纵深为什么这样写可靠alternation 的优先级陷阱括号必不可少在 13-regexp-alternation/article.md即本任务所属章节正文中作者反复强调 alternation 是表达式级别的 OR作用范围是整个分支而不是某个字符。其典型陷阱示例pattern:I love HTML|CSS实际匹配的是I love HTML或CSS只有pattern:I love (HTML|CSS)才匹配I love HTML或I love CSS。同理如果把解决方案写成不加括号的pattern:style|\s.*?就会被解析为style或\s.*?两个独立分支——第二个分支在任意位置遇到空白就能开始匹配完全失去了必须紧跟在style之后的约束。括号(|\s.*?)正是把两个结尾收拢到style之后的关键这与章节正文中时间正则([01]\d|2[0-3]):[0-5]\d用括号限定小时分支、避免|吞掉:[0-5]\d后缀是同一手法。为什么用\s而不是.字符类决定匹配精度如 02-regexp-character-classes/article.md 所述\s是空白符号字符类覆盖空格、制表符\t、换行\n及\v、\f、\r等而.是除换行外任意字符。HTML 标签属性区必须以空白与标签名分隔\s恰好精确表达这一语法事实而.会把任意字母如styler的r也当作合法分隔这就是两个误区成败的分水岭。为什么用.*?惰性匹配防止属性扫描越界.*?是惰性量词lazy quantifier见 10-regexp-greedy-and-lazy/article.md它尽可能少地重复每匹配一个字符就停下来尝试让后续的成立因此会停在第一个处。若写成贪婪的.*正则引擎会一路吞到字符串里最后一个把style test... styler之类后续内容一并吞进同一次匹配。当然这里的边界相对简单属性值中一般不会出现裸若遇到属性值内嵌的极端 HTML可进一步改用[^]*之类的排除型写法思路与本任务一致。实战验证与迁移把正解放入任务提供的测试字符串运行let regexp /style(|\s.*?)/g; alert( style styler style test....match(regexp) ); // style, style test... ← 符合预期再做一些额外边界测试以加深理解// 多个属性、属性值带引号 alert( style typetext/css idmain.match(regexp) ); // style typetext/css idmain // 无匹配styler 的两个分支都不满足 alert( styler.match(regexp) ); // null // 换行分隔的多行属性也匹配\s 覆盖 \n alert( style\n typetext/css.match(regexp) ); // style\n typetext/css同样的前缀 (结尾 | 空白分隔属性区)结构可以推广到其他标签/\w(|\s.*?)/g可匹配任意单词标签的完整形式而/(script|style)(|\s.*?)/gi可专门提取脚本与样式标签BB 代码、XML 标签等结构化文本同理。此类模式在 HTML 解析、日志清洗、代码高亮预处理等场景中都很实用。小结本任务的正解/style(|\s.*?)/g是 alternation、字符类与惰性量词三者的组合拳|分支表达直接闭合与属性区两种并列合法结尾括号把分支范围限定在style之后避免 alternation 的全局 OR语义破坏约束\s精确表达 HTML 中标签名与属性之间必须以空白分隔的语法规则是排除styler的关键.*?惰性匹配保证属性区止于第一个。想系统巩固相关知识可继续阅读 13-regexp-alternation 章节正文 掌握 alternation 语义与优先级以及同章节其余任务查找编程语言、匹配 BB 标签对、匹配带转义的引号字符串它们从不同角度锤炼用分支精确定义边界的正则思维。赞分享文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载相关推荐JavaScript 正则交替实战用 style(|\s.*?) 精确匹配完整 HTML 标签JavaScript 正则交替实战用 style |\s. ? 精确匹配完整 HTML 标签 正则表达式中的交替Alternation用 | 表示文档/教程前端Element UI 2.x 版本演进全解析基于法语版 Changelog 的组件、API 与破坏性变更指南Element UI 2.x 版本演进全解析基于法语版 Changelog 的组件、API 与破坏性变更指南 Element UI仓库路径 gh_mirro文档/教程前端Rich 终端渲染指南用 Python 打造精美命令行输出含 Console、表格、进度条、Markdown 与语法高亮全解析Rich 终端渲染指南用 Python 打造精美命令行输出含 Console、表格、进度条、Markdown 与语法高亮全解析 Rich 是 Python文档/教程前端上一篇Dolphin3步跑通轻量级文档解析下一篇UADK驱动开发指南如何为自定义硬件编写UADK驱动程序创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表