我似乎无法理解(?=。*?[A-Z])这个表达式

时间:2017-05-11 15:22:24

标签: regex

我正在尝试为我正在研究的密码验证器学习更高级的正则表达式,因为我认为使用正则表达式将是最佳方法。我使用Java作为我的编程语言

所以对于我的模式,人们建议这个(?=.*?[A-Z])说“字符串中至少有一个大写字母”。我至少尝试过搜索它,但似乎没有任何迹象表明?=.*?这个部分至少在那里确定了它。

这是整个模式^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$

根据我的理解

  1. ?意味着可选并且发生一次
  2. =意味着我还不知道
  3. 。是一个通配符
  4. [A-Z]是来自A-Z
  5. 的大写字母的范围

    TLDR:所以我的问题是这个(?=.*?[A-Z])如何确保至少包含一个大写字母?有任何深入的解释吗?

1 个答案:

答案 0 :(得分:0)

正则表达式使用名为正向前瞻的功能,这是正则表达式外观的一部分:

  • 积极向前看:(?=...)。例如:a(?=b)匹配a,如果后跟b
  • 否定前瞻:(?!...)。例如:a(?!b)匹配a,如果没有b
  • 正面观察:(?<=...)。例如:如果前面有(?<=a)b
  • ,则b匹配a
  • 负面观察:(?<!...)。例如:(?<=a)b匹配b,如果之前没有a

对于整个正则表达式,您可以使用此图表轻松查看您的模式:

enter image description here Diagram link

(?=.*?[A-Z])相关,它在^之后使用。因此,^(?=.*?[A-Z])$表示匹配一条开头和结尾的行,但最后只有一个大写字符