正向先行正则表达式

7

我有以下正则表达式:

^(?=.{8}$).+

我理解这个正则表达式将接受8个任意类型的字符,后跟1个或多个任意字符。我感觉我没有掌握正向先行断言的工作原理。因为正则表达式的两个部分都在寻找'.',所以任何一系列字符都符合这个条件吗?
我的问题是,正向先行断言如何影响这个正则表达式,有哪些匹配字符串的例子?
以下内容在提供的正则表达式工具中未匹配成功:
  • 12345678
  • (12345678)1
  • (12345678)
  • (abcdefgh)a
  • (abcdefgh)
  • abc
  • 123
编辑:删除前两个数据条目,因为显然我没有正确使用正则表达式工具,现在它们与恰好8个字符匹配。

你的正则表达式与 ^.{8}$ 有相同的含义。除非这是一个更大的正则表达式的一部分,否则我不明白你为什么要使用 lookahead。 - nhahtdh
这是一个供我用于验证器的正则表达式,现在我看到它的工作原理后,我也不明白他们为什么会选择它!我认为这就是最初让我困惑的地方。 - Nashibukasan
3个回答

10

^(?=.{8}$).+

这个正则表达式将匹配字符串

aaaaaaaa

推理如下:

方括号内的内容是一个前瞻,因为它以?=开头。

前瞻内的内容被解析 - 它不是按字面意义解释的。

因此,只有当.{8}$匹配成功时,前瞻才允许正则表达式进行匹配(在本例中是在字符串开头)。所以该字符串必须恰好有八个字符,然后以$结尾。

然后.+将匹配这八个字符。


一个人为什么要使用正向预查技巧,而不是直接匹配8个字符,例如:^.{8}$ - Paul Razvan Berg

6

它正在尝试匹配:

^               # start of line, but...
(?=.{8}$)       # only if it precedes exactly 8 characters and the end of line
.+              # this one matches those 8 characters

根据您的输入,它还应该与这些内容匹配(可以尝试这个引擎并勾选匹配换行符):

12345678
abcdefgh

我一定是留下了尾随空格或设置了不正确的选项,因为现在我正在获取这些匹配项。已经更新了我的问题,以便未来的用户更清楚明白。 - Nashibukasan

0

在 Ruby 中,匹配 12345678 是可行的:

'12345678' =~ /^(?=.{8}$).+/ 
=> 0 

可能你的测试网站不支持正则表达式前瞻?


测试站点确实支持前瞻,至少在默认设置为.NET版本上是这样的。我知道这一点,因为那就是我测试他的正则表达式的方式 :) - Patashu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接