2010-08-16 134 views
1

确定我得到从正则表达式食谱这个例子先行混乱

^(?=.{3}$).* 

正则表达式以上是使用限制的任意图案

的长度如果我再次“AAABBB”测试,它完全失败

从我的理解它寻找一个任意字符3 length.SO之前应该符合“BBB”,但它不是

一个问题,寿任何字符ld lookbehind遵循这种模式x(?= x)

+0

你所使用的先行断言,因为它看起来在那个还没有消耗字符。后顾断言会查看已经消耗的字符。 – Gumbo 2010-08-16 18:22:33

+0

但是你究竟想要完成什么? – Gumbo 2010-08-16 18:22:55

+0

编辑:限制任意模式的长度 – slier 2010-08-16 18:27:40

回答

5

这实际上是一个前瞻断言而不是后置断言。 ^在字符串的起始处锚定匹配,然后声明字符串的开头必须跟着3个字符,后面跟着字符串的结尾。

编辑:我应该可能已经提到,*末尾用于匹配这三个字符,因为前瞻断言不会消耗任何字符。

+0

你的意思是不消耗任何字符? – slier 2010-08-16 18:35:12

+0

我的意思是,在完成lookahead断言之后,正则表达式引擎继续比较它进入lookahead的点的字符串。所以给定模式'^(?= foo)(。*)$'和输入'foobar'由捕获组1捕获的值将是'foobar'。该模式将首先执行向前看,即检查字符串的开始是否为foo,然后它将移到'。*'上,因为lookahead不消耗任何字符,这意味着与。*匹配的第一个字母是然后等到它捕捉到'foobar' – 2010-08-16 18:43:34

4

从我的理解是寻找那些在length.SO任何字符3之前,应该符合“BBB”,但它不是

都能跟得上任何字符!让我们来仔细看看...

^  # The caret is an anchor which denotes "STARTS WITH" 
(?=  # lookahead 
    .  # wildcard match; the . matches any non-new-line character 
    {3} # quantifier; exactly 3 times 
    $  # dollar sign; I'm not sure if it will act as an anchor but if it did it would mean "THE END" 
)  # end of lookbehind 
.  # wildcard match; the . matches any non-new-line character 
*  # quantifier; any number of times, including 0 times 

几个问题:

  1. 插入符号要求.*是字符串中的第一个字符,然后你想回顾后他们之间sandwhiched字符开始^和第一个字符.*
  2. .{3}实际上意味着任何三个字符,任何字符重复三次;)你真的想知道How can I find repeated letters with a Perl regex?