1

好的,我从正则表达式食谱中得到了这个例子

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

上面的正则表达式用于限制任意模式的长度

如果我再次测试'aaabbb',它会完全失败

据我了解,它会查找长度为任何字符 3 的任何字符。所以它应该匹配 'bbb' 但它不是

还有一个问题,应该遵循这种模式 x(?=x)

4

2 回答 2

6

这实际上是一个前瞻断言而不是一个后瞻断言。^ 将匹配锚定在字符串的开头,然后它断言字符串的开头必须后跟 3 个字符,然后是字符串的结尾。

编辑:我可能应该提到最后的 .* 用于匹配这三个字符,因为前瞻断言不消耗任何字符。

于 2010-08-16T18:18:46.733 回答
4

据我了解,它会查找长度为任何字符 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. 插入符号要求.*字符串中的第一个字符,然后您尝试在它们后面查找夹在开头^和第一个字符之间的字符.*
  2. .{3}实际上是指任何三个字符,而不是任何重复三次的字符;)您实际上想知道如何使用 Perl 正则表达式找到重复的字母?
于 2010-08-16T18:22:28.360 回答