- 文档/教程
- 前端
【免费下载链接】en.javascript.info
Modern JavaScript Tutorial
本指南以 Modern JavaScript Tutorial(en.javascript.info)正则表达式章节中的"词边界(word boundary)"练习为核心,系统讲解\b的判定原理、三种边界位置、与数字结合的用法及其对非拉丁字母的局限,并逐层拆解 "查找 HH:MM 格式时间" 任务的题意与官方题解,帮助读者掌握用\b精确定位独立词与独立数字片段的实战能力。
练习定位:仓库中的词边界章节
在仓库的9-regular-expressions/06-regexp-boundary目录下,包含了完整的词边界教学章节与配套练习:
- 章节正文:article.md,系统讲解
\b的定义、三种边界位置与使用示例; - 配套练习:
1-find-time-hh-mm子目录,包含 task.md(任务描述)与 solution.md(官方题解)。
本练习是词边界知识点的首个实战任务,用于验证读者是否真正理解了\b作为"零宽断言(zero-width assertion)"的语义——它不消耗任何字符,只在特定位置上做条件判断。
词边界\b是什么:一种位置测试
与^(字符串开头)和$(字符串结尾)一样,\b也是一种测试(test),而不是匹配某个具体字符的模式。当正则引擎(负责执行正则搜索的程序模块)遇到\b时,它会检查当前字符串位置是否恰好是一个"词边界"。
按照章节原文,共有三种位置满足词边界条件:
- 字符串开头,且第一个字符是词字符
\w; - 字符串内部两个字符之间,一侧是词字符
\w,另一侧不是; - 字符串结尾,且最后一个字符是词字符
\w。
其中\w指拉丁字母a-z(含大写)、数字0-9和下划线_。换句话说,\b要求当前位置两侧恰好一边是"词字符"、一边是"非词字符"(或字符串边界)。
经典示例:\bJava\b
考虑字符串subject:Hello, Java!:pattern:\bJava\b能匹配其中的独立单词Java,但不会匹配subject:Hello, JavaScript!中的Java(因为Java后面紧跟着词字符S,不存在边界)。
alert( "Hello, Java!".match(/\bJava\b/) ); // Java alert( "Hello, JavaScript!".match(/\bJava\b/) ); // null在字符串Hello, Java!中,下列位置恰好对应\b:
因此,模式pattern:\bHello\b也能匹配成功,匹配过程如下:
- 字符串开头匹配第一个
\b(首字符H是词字符); - 接着匹配单词
Hello; - 在
o与逗号之间再次命中\b(一侧是词字符o,另一侧是逗号)。
所以\bHello\b匹配成功,而\bHell\b匹配失败(l之后紧跟着o,没有边界),\bJava!\b同样失败(感叹号不是词字符\w,Java!内部不存在边界)。
alert( "Hello, Java!".match(/\bHello\b/) ); // Hello alert( "Hello, Java!".match(/\bJava\b/) ); // Java alert( "Hello, Java!".match(/\bHell\b/) ); // null (no match) alert( "Hello, Java!".match(/\bJava!\b/) ); // null (no match)\b与数字结合:匹配独立的两位数
\b不仅能用于单词,同样适用于数字。章节中给出的核心示例是pattern:\b\d\d\b——查找"独立的两位数",即两侧被非\w字符(空格、标点、字符串开头/结尾)包围的两位数。
alert( "1 23 456 78".match(/\b\d\d\b/g) ); // 23,78 alert( "12,34,56".match(/\b\d\d\b/g) ); // 12,34,56- 在
1 23 456 78中,23两侧是空格、78位于字符串结尾,均满足边界条件;而456中的45与56因紧邻\w字符而被排除; - 在
12,34,56中,逗号属于非\w字符,因此三个两位数全部命中。
这里使用了g标志(全局搜索),让.match()返回所有匹配结果组成的数组。这正是解决 HH:MM 时间查找任务的核心技巧基础。
重要局限:\b不适用于非拉丁字母
章节末尾专门给出了一条警告:\b的判定依赖\w,而\w仅涵盖拉丁字母、数字和下划线。因此,对西里尔字母、汉字等非拉丁字符,\b无法正常工作。
例如中文文本中"上午09点"这类场景,\b可能不会在汉字与数字之间判定出边界。遇到多语言文本时,应改用显式的字符类断言(如(?<!\w)/(?!\w)或结合 Unicode 属性)替代\b,这一点在处理国际化文本时尤其重要。
任务原文与需求拆解
练习1-find-time-hh-mm的任务描述如下:
时间采用
hours:minutes格式,小时和分钟都是两位数,例如09:00。 编写一个正则表达式,在字符串Breakfast at 09:00 in the room 123:456.中查找时间。 P.S. 本任务暂时无需校验时间的正确性,因此25:99也可以视为合法结果。 P.P.S. 正则表达式不应匹配123:456。
拆解需求可以得到三个关键约束:
- 格式约束:
小时:分钟均为恰好两位数字,即形如\d\d:\d\d; - 边界约束:时间必须是字符串中的独立片段,不能被其他数字字符"粘连"——这正是排除
123:456的关键; - 正确性约束:本阶段不校验时间是否真实有效,
25:99也算合法,因此无需引入小时/分钟范围判断。
陷阱点在于:字符串中同时存在09:00与123:456,后者内部包含形如23:45的片段,若只写\d\d:\d\d而不加边界约束,就会错误命中123:456中的23:45。
官方题解:/\b\d\d:\d\d\b/
仓库中的官方题解给出了答案:
alert( "Breakfast at 09:00 in the room 123:456.".match( /\b\d\d:\d\d\b/ ) ); // 09:00模式由三部分组成:
\b:左侧词边界,要求冒号前的第一个数字前不是词字符;\d\d:\d\d:两位数字、冒号、两位数字;\b:右侧词边界,要求冒号后的第二个数字后不是词字符。
为什么不会匹配123:456
让我们跟随正则引擎的匹配过程分析:
- 候选片段
23:45(来自123:456):其左侧是字符1。1属于\w,因此在1与2之间不存在词边界,左侧的\b判定失败,整个候选被拒绝; - 引擎继续尝试从
3开始匹配,但3之后是冒号,不足两个数字,无法构成\d\d:\d\d; - 因此
123:456被整体排除。
而09:00的左侧是空格、右侧也是空格(后接句点前的空格),两侧都满足\b条件,匹配成功。
若使用全局标志/\b\d\d:\d\d\b/g,在包含多个时间的字符串中可以一次性取出全部合法时间片段,例如:
"Meet at 09:00, lunch at 12:30, see 123:456".match(/\b\d\d:\d\d\b/g); // ['09:00', '12:30']扩展思考:从边界控制到时间正确性校验
本任务刻意省略了时间正确性校验(25:99也合法)。如果需要进一步校验小时与分钟范围,可以在\b\d\d:\d\d\b的基础上把数字部分替换为带范围的模式,例如:
- 小时
00-23:([01]\d|2[0-3]) - 分钟
00-59:[0-5]\d
组合后的完整模式形如/\b([01]\d|2[0-3]):[0-5]\d\b/。需要注意的是,这是练习题之外的进阶方向,仓库原文并未包含此实现,读者可将其作为课后延伸自行验证。
另一个值得注意的对比是:\b与字符串锚点^、$的关系。^与$只作用于字符串首尾,而\b作用于字符串内部的每个"词/非词"交界处,二者定位粒度不同。当需要把时间限制在整段文本的开头或结尾时,可组合使用,例如^\d\d:\d\d$用于校验"整个字符串就是一个时间"。
仓库参考路径汇总
- 章节正文:9-regular-expressions/06-regexp-boundary/article.md
- 任务描述:9-regular-expressions/06-regexp-boundary/1-find-time-hh-mm/task.md
- 官方题解:9-regular-expressions/06-regexp-boundary/1-find-time-hh-mm/solution.md
- 边界位置示意图:9-regular-expressions/06-regexp-boundary/hello-java-boundaries.svg
- 正则表达式章节总览:9-regular-expressions/index.md
本文所有示例与结论均可直接在仓库对应文件中复现验证:先通读 article.md 理解\b语义,再动手运行题解中的.match()调用,即可完整掌握"用词边界精确锁定独立时间片段"这一实战技能。
- 文档/教程
- 前端
【免费下载链接】en.javascript.info
Modern JavaScript Tutorial
相关推荐
JavaScript 正则表达式 \b 单词边界实战:用 `\b\d\d:\d\d\b` 精确匹配 HH:MM 格式时间
JavaScript 正则表达式 \b 单词边界实战:用 \b\d\d:\d\d\b 精确匹配 HH:MM 格式时间 导读 本篇围绕 en.javascript
文档/教程前端Modern JavaScript Tutorial 任务实战:用 JavaScript 编写 min(a, b) 求两数最小值
Modern JavaScript Tutorial 任务实战:用 JavaScript 编写 min a, b 求两数最小值 本篇文章围绕《Modern Ja
文档/教程前端JavaScript 正则表达式中的词边界 \b 详解
JavaScript 正则表达式中的词边界 \b 详解 正则表达式是 JavaScript 中强大的文本处理工具,而词边界 \b 是一个经常被忽视但非常有用的元
文档教程前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考