2010-08-16 3 views
1

Ok я получил этот пример из Regular Expression CookbookLookahead путаница

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

Регулярное выражение выше использовать, чтобы ограничить длину произвольного рисунка

Если я проверить снова «aaabbb», это совершенно не

Из того, что я понимаю, это выглядит для любого характера, которые предшествуют любой символ 3 в length.SO он должен соответствовать «BBB», но его не

еще один вопрос, Shou ld lookbehind следуйте этому шаблону x (? = x)

+0

Что вы используете это упреждающая утверждение, как он смотрит на персонажах, которые еще не потребленные , Утверждение о взгляде будет смотреть на символы, которые уже потреблены. – Gumbo

+0

Но что именно вы пытаетесь достичь? – Gumbo

+0

отредактировано: Ограничить длину произвольного шаблона – slier

ответ

5

Это на самом деле утверждение, не являющееся утверждением lookbehind.^Привязывает совпадение в начале строки, затем утверждает, что за началом строки должны следовать 3 символа, за которыми следует конец строки.

Редактировать: Я должен был, вероятно, упомянуть, что. * В конце затем используется для сопоставления этих трех символов, поскольку утверждение lookahead не потребляет никаких символов.

+0

что вы имеете в виду, не употребляя никаких символов? – slier

+0

Я имею в виду, что после завершения утверждения lookahead механизм Regex продолжает сравнивать строку с точки, в которую он ввел lookhhead. Так что задан шаблон '^ (? = Foo) (.*) $ 'и ввод' foobar' захвата значения группой захвата 1 будет 'foobar'. Сначала будет выполняться внешний вид, т. Е. Проверить, является ли начало строки foo, а затем переместится на '. *', Так как lookahead не потребляет никаких символов, это означает, что первая буква соответствует *. f затем o и так далее, пока он не захватил «foobar», –

4

Из того, что я понимаю, это выглядит для любого характера, которые предшествуют любой символ 3 в length.SO он должен соответствовать «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?

 Смежные вопросы

  • Нет связанных вопросов^_^