Javascript 词边界:\b
词边界 b
是一种检查,就像 ^
和 $
一样。
当正则表达式引擎(实现正则表达式搜索的程序模块)遇到 b
时,它会检查字符串中的位置是否是词边界。
有三种不同的位置可作为词边界:
- 在字符串开头,如果第一个字符是单词字符
w
。 - 在字符串中的两个字符之间,其中一个是单词字符
w
,另一个不是。 - 在字符串末尾,如果最后一个字符是单词字符
w
。
例如,可以在 Hello, Java!
中找到 bJavab
的匹配项,其中 Java
是一个独立的单词,而在 Hello, JavaScript!
中则不行。
alert( "Hello, Java!".match(/bJavab/) ); // Java
alert( "Hello, JavaScript!".match(/bJavab/) ); // null
在字符串 Hello, Java!
中,以下位置对应于 b
:
因此,它与模式 bHellob
相匹配,因为:
- 字符串的开头符合第一个检查
b
。 - 然后匹配了单词
Hello
。 - 然后与
b
再次匹配,因为我们在 o
和逗号之间。
所以模式 bHellob
会匹配,但 bHellb
不会匹配(因为在 l
之后没有单词边界),Java!b
也不会匹配(因为感叹号不是单词字符 w
,所以其后没有词边界)。
alert( "Hello, Java!".match(/bHellob/) ); // Hello
alert( "Hello, Java!".match(/bJavab/) ); // Java
alert( "Hello, Java!".match(/bHellb/) ); // null(无匹配项)
alert( "Hello, Java!".match(/bJava!b/) ); // null(无匹配项)
b
既可以用于单词,也可以用于数字。
例如,模式 bddb
查找独立的两位数。换句话说,它查找的是两位数,其周围是与 w
不同的字符,例如空格或标点符号(或文本开头/结尾)。
alert( "1 23 456 78".match(/bddb/g) ); // 23,78
alert( "12,34,56".match(/bddb/g) ); // 12,34,56
词边界
b
不适用于非拉丁字母词边界测试
b
检查该位置的一侧是否匹配w
,而另一侧则不匹配 “w
”。
但是,
w
表示拉丁字母a-z
(或数字或下划线),所以此检查不适用于其他字符,如西里尔字母(cyrillic letters)或象形文字(hieroglyphs)。
任务
查找时间
时间的格式是:小时:分钟
。小时和分钟都是两位数,例如 09:00
。
编写正则表达式在字符串 Breakfast at 09:00 in the room 123:456.
中查找时间。
P.S. 在这个任务里没有必要校验时间的正确性,所以 25:99
也可算做有效的结果。
P.P.S. 正则表达式不应该匹配 123:456
。
解决方案
答案是:bdd:ddb
。
alert( "Breakfast at 09:00 in the room 123:456.".match( /bdd:ddb/ ) ); // 09:00