正则表达式 - 前瞻性断言

luk*_*443 9 regex regex-lookarounds

我有先行断言(?=)的问题.例如,我有表达式:

/Win(?=2000)/
Run Code Online (Sandbox Code Playgroud)

它匹配Win,如果表达式是Win2000,Win2000fgF.我有下一个表达式:

^(?=.*\d)(?=.*[a-z]).*$
Run Code Online (Sandbox Code Playgroud)

它匹配数字和小写字母,例如:45dF,4Dd.但我不知道,为什么它的工作和匹配所有字符:)我没有字符,这是以前(?=.*\d).我想,只有这个表达式应该有效:

^.\*(?=.*\d)(?=.*[a-z]).*$
Run Code Online (Sandbox Code Playgroud)

(\*在表达之前).

你能解释一下吗?

Tim*_*ker 39

假设我们是正则表达式引擎并将正则表达式^(?=.*\d)(?=.*[a-z]).*$应用于字符串2a.

从位置0开始(在第一个字符之前):

  1. ^:确保我们在字符串的开头:好的
  2. (?=:让我们检查以下正则表达式是否匹配......
  3. .*:匹配任意数量的字符 - > 2a.好.
  4. \d:不,我们已经结束了.让我们回到一个字符:a- >不,不匹配.回去另一个:2- >匹配!
  5. ):前瞻,比赛成功.我们还在 0号位置!
  6. (?=:让我们检查以下正则表达式是否匹配......
  7. .*:匹配任意数量的字符 - > 2a.好.
  8. [a-z]:不,我们已经结束了.让我们回到一个角色:a- >匹配!
  9. ):前瞻,比赛成功.我们还在 0号位置!
  10. .*:匹配任意数量的字符 - > 2a- >匹配!
  11. $:让我们看看 - 我们在字符串的末尾吗?是的我们是! - >比赛!
  12. 嘿,我们已经到了正则表达式的末尾.大.比赛完成了!

  • 好吧,想象一下你退出第10步 - 正则表达式引擎仍处于0位置,因此无法匹配`$`. (4认同)