对Dart中的(?=)`正则表达式感到困惑吗?我知道这是前瞻性的。正文中的更多细节

时间:2018-11-17 10:30:07

标签: regex dart flutter

首先,我知道x(?=y)仅在'x'后跟'x'时才匹配'y'

  • 但是,当我尝试r'^(?=.*[0-9])(?=.*[a-z])'时,

    • 为什么0aa0都匹配?
    • 为什么顺序根本不重要?
    • 对于0a,它匹配什么?
      • 如果它与0之前的空字符串匹配,则它将失败第二个条件(?=.*[a-z]),因为0之前的空字符串后跟0,而不是{{1 }}。
      • 如果它与a-z相匹配,因为它后跟0,则它应该失败第一个条件,因为a不能跟0
      • 我不知道我的想法出了什么问题。而且我不确定我是否清楚表达自己的意思,以便您可以理解我的意思。
  • ,对于[0-9],如果没有r'^(?=.*[0-9])(?=.*[a-z])$'的上述情况有效,为什么不这样做?我不知道这匹配什么。似乎没有任何匹配。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

regex101.com具有一个正则表达式调试器,您可以使用它来查看正则表达式引擎的确切行为。

这里要注意的一个好点是,正则表达式中的匹配项始终为0长度,因为(?=)不匹配任何内容。他们只是期待检查模式。

您可能知道,正则表达式引擎会在与字符匹配时从字符串的开头移动到字符串的结尾。

  

为什么0a匹配?

最初,引擎位于字符串的开头。它与“字符串开始”锚点^相匹配。然后检查是否可以看到前瞻(?=.*[0-9])中描述的模式。它可以?是。 .*不能匹配任何内容,而[0-9]可以匹配0。然后,它检查第二次超前。请注意,发动机仍处于启动位置。它检查(?=.*[a-z]).*匹配0,而[a-z]匹配a。两个前瞻匹配,因此^保持匹配。

  

为什么a0匹配?

这与以前几乎相同。第一个前瞻:.*匹配a,而[0-9]匹配0。第二个前瞻:.*不匹配任何内容,[a-z]匹配a。 / p>

  

^(?=.*[0-9])(?=.*[a-z])$为什么表现不同?

实际上,该正则表达式永远无法匹配。没有先行者,正则表达式将变为^$。仅空字符串匹配^$。而且空字符串不能包含字母和数字,因此前瞻将始终失败。