2010-10-08 22 views
5

Tengo una Perl regex. Pero no estoy seguro de qué "? significa en este contexto.¿Qué significa `?` En este Perl regex?

m#(?:\w+)#

¿Qué significa ? significa aquí?

+5

Empezando por el más obvio: perlre (http://perldoc.perl.org/perlre.html). – musiKk

+0

@msw y uno de ellos es [esta página aquí] (http://stackoverflow.com/questions/3890739/what-does-mean-in-this-perl-regex?rq=1). – rightfold

Respuesta

25

En este caso, el ? en realidad se está utilizando en relación con el :. En conjunto, ?: al comienzo de una agrupación significa agrupar pero no capturar el texto/patrón entre paréntesis (como en, no se almacenará en ninguna referencia como \1 o $1, por lo que no podrá acceder al grupo texto directamente).

Más específicamente, un ? tiene tres significados distintos en regex:

  1. El cuantificador ? significa "cero o uno repeticiones" de una expresión. Uno de los ejemplos canónicos que he visto es s?he que coincidirá tanto she y he ya que el ? hace que el s "opcional"

  2. Cuando un cuantificador (+, *, ?, o al general {n,m}) es seguido por un ? entonces el partido es no expansivo (es decir, que coincidirá con una cadena más corta a partir de esa posición que permita el partido de proceder)

  3. un ? al principio de un grupo entre paréntesis significa que usted desea realizar una especial acción. Como en este caso, : significa agrupar pero no capturar. La lista exacta de acciones disponibles variará algo de un motor de expresiones regulares a otro, pero aquí hay una lista (no necesariamente todo incluido) de algunos de ellos:

    A. Non-capturing group: (?:text)
    B. Lookaround: (?=a) para una lookahead, ?! para lookahead negativo, o ?<= y ?<! para lookbehinds (positivo y negativo, respectivamente).
    C. Conditional Matches: (?(condition)then|else).
    D. Atomic Grouping: a(?>bc|b)c (coincide abcc pero noabc; ver el link)
    E. Inline enabling/disabling of regex matching modifiers: ?i para habilitar un modo, ?-i deshabilitar. También puede habilitar/deshabilitar más de un modificador a la vez simplemente concatenándolos, como ?im (i no distingue entre mayúsculas y minúsculas y m es multilínea).
    F. Named capture groups: (?P<name>pattern), que más tarde se puede hacer referencia utilizando (?P=name). El motor .NET regex usa la sintaxis (?<name>pattern).
    G. Comments: (?#Comment text). Personalmente creo que esto solo agrega desorden, pero creo que podría servir para algo ... free-spacing mode podría ser una mejor opción (el modificador (?x)).

En esencia, el propósito del ? es simplemente contextual.Si quería cero o más repeticiones de un personaje literal (, tendría que usar \(? para escapar del paréntesis.

+0

Para el punto # 3, también hay '(?> ...)', que es un [grupo atómico] (http://www.regular-expressions.info/atomic.html) en los sabores que lo soportan, y ' (? i) 'y' (? -i) 'para habilitación/inhabilitación en línea de [modificadores] (http://www.regular-expressions.info/modifiers.html). –

+0

@Daniel: Gracias. Creo que voy a limpiar el n. ° 3 y agregar una lista con algunos enlaces, para que otras personas puedan continuar agregando también. – eldarerathis

+0

Solo para mayor claridad, '(? Im)' habilita dos modos (sin distinción entre mayúsculas y minúsculas y multilínea);) –

2

Esos son paréntesis que no capturan. Se usan para agrupar (al igual que los paréntesis normales) pero el grupo no se agregará a la matriz de captura (es decir, no será referenciable con \ n).

Ver aquí: http://www.regular-expressions.info/refadv.html

7

$ perldoc perlreref:

(?:...) Grupos subexpresiones sin capturar (cluster)

Usted can also useYAPE::Regex::Explain:

C:\\Temp> perl -MYAPE::Regex::Explain -e \ 
"print YAPE::Regex::Explain->new(qr#(?:\w+)#)->explain" 

The regular expression: 

(?-imsx:(?:\w+)) 

matches as follows: 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
(?-imsx:     group, but do not capture (case-sensitive) 
         (with^and $ matching normally) (with . not 
         matching \n) (matching whitespace and # 
         normally): 
---------------------------------------------------------------------- 
    (?:      group, but do not capture: 
---------------------------------------------------------------------- 
    \w+      word characters (a-z, A-Z, 0-9, _) (1 or 
          more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of grouping 
---------------------------------------------------------------------- 
)      end of grouping 
----------------------------------------------------------------------
2

En resumen, la secuencia (? comienza una característica especial de expresiones regulares. Las cosas que siguen al (? especifican la característica especial, en este caso, una agrupación que no captura. Cubrimos esto en Intermedio Perl y Perl Programming efectivo. El perlre documenta expresiones regulares de Perl.