2021年12月12日

单词边界:\b

单词边界 \b 是一个测试,就像 ^$ 一样。

当正则表达式引擎(实现正则表达式搜索的程序模块)遇到 \b 时,它会检查字符串中的位置是否为单词边界。

有三种不同的位置符合单词边界

  • 在字符串开头,如果第一个字符串字符是单词字符 \w
  • 在字符串中的两个字符之间,其中一个是单词字符 \w,另一个不是。
  • 在字符串结尾,如果最后一个字符串字符是单词字符 \w

例如,正则表达式 \bJava\b 将在 Hello, Java! 中找到,其中 Java 是一个独立的单词,但在 Hello, JavaScript! 中则不会找到。

alert( "Hello, Java!".match(/\bJava\b/) ); // Java
alert( "Hello, JavaScript!".match(/\bJava\b/) ); // null

在字符串 Hello, Java! 中,以下位置对应于 \b

因此,它匹配模式 \bHello\b,因为

  1. 在字符串开头匹配第一个测试 \b
  2. 然后匹配单词 Hello
  3. 然后测试 \b 再次匹配,因为我们位于 o 和逗号之间。

所以模式 \bHello\b 会匹配,但 \bHell\b 不会(因为在 l 之后没有词边界),并且 Java!\b 也不会(因为感叹号不是单词字符 \w,所以它之后没有词边界)。

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\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
词边界 \b 不适用于非拉丁字母

词边界测试 \b 检查在位置的一侧应该有 \w,而在另一侧则“没有 \w”。

\w 表示拉丁字母 a-z(或数字或下划线),因此该测试不适用于其他字符,例如西里尔字母或象形文字。

任务

时间格式为:hours:minutes。小时和分钟都有两位数,例如 09:00

创建一个正则表达式来查找字符串中的时间:Breakfast at 09:00 in the room 123:456.

附注:在本任务中,无需检查时间的正确性,因此 25:99 也可以是有效结果。

附注:正则表达式不应匹配 123:456

答案:\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
教程地图

评论

在评论之前阅读…
  • 如果您有改进建议,请提交 GitHub 问题或拉取请求,而不是评论。
  • 如果您不理解文章中的某些内容,请详细说明。
  • 要插入几行代码,请使用 <code> 标签,对于多行代码,请将其包装在 <pre> 标签中,对于超过 10 行的代码,请使用沙箱(plnkrjsbincodepen…)