29.正向和负向Lookahead

说明

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的更实际用途是预查一个字符串中的两个或多个模式。以下是一个简单的密码检查器,预查36个字符和至少一个数字:

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值