说明
Lookahead
是一种模式,可以让JavaScript在字符串中预先检查,以便进一步检查模式。当你想在同一个字符串中搜索多个模式时,这可能很有用。
lookaheads
有两种:positive lookahead
正向预查和negative lookahead
负向预查。
positive lookahead
将预查确保搜索模式中的元素在那里,但实际上不会匹配它。正向预查是使用(?=...)
,其中...
是不匹配的必需部分。
另一方面,negative lookahead
将会预查搜索模式中的元素不存在。负向预查是使用(?!...)
,其中...
是你不想在那里出现的模式。如果不存在负向预查的部分,则返回该模式的其余部分。
Lookahead会让人有点混乱,但一些例子可以帮助你理解。
var quit = "qu";
var noquit = "qt";
var quRegex= /q(?=u)/;
var qRegex = /q(?!u)/;
quit.match(quRegex); // 返回 ["q"]
noquit.match(qRegex); // 返回 ["q"]
lookaheads
的更实际用途是预查一个字符串中的两个或多个模式。以下是一个简单的密码检查器,预查3到6个字符和至少一个数字:
var password = "abc123";
var checkPass = /(?=\w{3,6})(?=\D*\d)/;
checkPass.test(password); // 返回 true
练习
在pwRegex
中使用lookaheads
来匹配长度大于5个字符并具有两个连续数字的密码。
- 你的正则表达式应该使用两个正向
lookaheads
. - 你的正则表达式应该不匹配
"astronaut"
。 - 你的正则表达式应该不匹配
"airplanes"
。 - 你的正则表达式应该匹配
"bana12"
。 - 你的正则表达式应该匹配
"abc123"
。 - 你的正则表达式应该不匹配
"123"
。 - 你的正则表达式应该不匹配
"1234"
。
var pwRegex = /change/; // Change this line
答案
方法 | 描述 |
正则表达式 | 正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。 |
元字符 | 描述 |
? | 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 |
(?=pattern) | 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
{n,} | n 是一个非负整数。至少匹配n 次。
例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 |
var pwRegex = /(?=\w{5,})(?=\D*\d)/; // Change this line