[Cascavel-pm] coincidência de padrões e um lugar específico numa string

Wendel Scardua wendelscardua em gmail.com
Terça Agosto 26 06:49:01 PDT 2008


Resposta curta: RTFM, aka "perldoc perlre" :-)

Resposta longa:

(? normalmente não é algo válido, então essa expressão é usada para
algumas especiais (condicionais, recursividade, look-forward, etc...)

No caso, a expressão é (?: .... ) , que é um grupo-que-não-captura.

Normalmente, você usa os parênteses pra "capturar" a ocorrência
(armazenando-a em $1, $2, etc... ). Mas às vezes você quer agrupar uma
parte da regexp só pra aplicar uma operação, como em:
/foo(\d+lerolero)*bar/ . Aqui, você pode não estar interessado em
colocar o match de "\d+lerolero" em $1, você só queria aplicar o "*"
naquele trecho - sem falar que essa captura é mais ineficiente. Então
você usa o (?: ... ) pra agrupar:

/foo(?:\d+lerolero)*bar/

Além disso, o (?: ) permite a você passar algumas opções de regexp
apenas praquele trecho ( como o /i pra ser case-insensitive, ou /s pro
"." casar com quebra de linha, etc...):

/foo(?i:.+lerolero)*bar/

Ou ainda tirar essas opções do trecho (ou ao mesmo tempo habilitar
coisas e desabilitar coisas):

/foo(?s-i:.+lerolero)*bar/i

E, claro, perldoc perlre para mais informações. :-)

[]s
Wendel

2008/8/26  <fernandolouis em terra.com.br>:
> *? e (?
>
> O "?" é um quantifdicador nessa expressão? Desconnheço outra função do "?"
> se não esta.
>


Mais detalhes sobre a lista de discussão Cascavel-pm