2010-10-08 20 views
5

Ho un'espressione regolare Perl. Ma non sono sicuro di cosa "?" significa in questo contesto.Cosa significa `?` In questa espressione regolare di Perl?

m#(?:\w+)#

Cosa significa "?"?

+5

Inizio con il più ovvio: perlre (http://perldoc.perl.org/perlre.html). – musiKk

+0

@msw e uno di questi è [questa pagina qui] (http://stackoverflow.com/questions/3890739/what-does-mean-in-this-perl-regex?rq=1). – rightfold

risposta

25

In questo caso, lo ? viene effettivamente utilizzato in connessione con lo :. Mettere insieme, ?: all'inizio di un raggruppamento significa raggruppare ma non catturare il testo/modello tra parentesi (come in, non sarà memorizzato in nessun backferfer come \1 o $1, quindi non sarà possibile accedere al raggruppamento testo direttamente).

Più specificamente, un ? ha tre significati distinti in regex:

  1. Il ? quantificatore significa "zero o una ripetizione" di un'espressione. Uno degli esempi canonici che ho visto è s?he che corrisponderà sia she e he dal momento che il ? rende il s "optional"

  2. Quando un quantificatore (+, *, ?, o il generale {n,m}) è seguita da un ? allora la partita non è avido (vale a dire che corrisponderà alla stringa più breve partendo da quella posizione che permette l'incontro di procedere)

  3. a ? all'inizio di un gruppo tra parentesi indica che si desidera eseguire uno speciale azione. Come in questo caso, : significa raggruppare ma non acquisire. L'elenco esatto delle azioni disponibili variano un po 'da un motore regex ad un altro, ma ecco un elenco (non necessariamente all-inclusive) di alcuni di essi:

    A. Non-capturing group: (?:text)
    B. Lookaround: (?=a) per un lookahead, ?! per lookahead negativo o ?<= e ?<! per lookbehinds (positivo e negativo, rispettivamente).
    C. Conditional Matches: (?(condition)then|else).
    D. Atomic Grouping: a(?>bc|b)c (corrisponde abcc ma non abc, vedi il link)
    E. Inline enabling/disabling of regex matching modifiers: ?i per attivare una modalità, ?-i per disattivare. È inoltre possibile abilitare/disabilitare più di un modificatore alla volta semplicemente concatenandoli, ad esempio ?im (i non fa distinzione tra maiuscole e minuscole e m è multilinea).
    F. Named capture groups: (?P<name>pattern), che può essere successivamente referenziato utilizzando (?P=name). Il motore regex .NET utilizza invece la sintassi (?<name>pattern).
    G. Comments: (?#Comment text). Personalmente penso che questo aggiunge solo confusione, ma immagino che potrebbe servire un po '... free-spacing mode potrebbe essere una soluzione migliore (il modificatore (?x)).

Quindi, in sostanza, lo scopo della ? è solo contestuale.Se vuoi zero o più ripetizioni di un carattere letterale (, devi usare \(? per sfuggire al paren.

+0

Per il punto # 3, c'è anche '(?> ...)', che è un [gruppo atomico] (http://www.regular-expressions.info/atomic.html) in sapori che lo supportano, e ' (? i) 'e' (? -i) 'per abilitare/disabilitare in linea i [modificatori] (http://www.regular-expressions.info/modifiers.html). –

+0

@Daniel: Grazie. Penso che ripulire il n. 3 e aggiungere una lista con alcuni link, in modo che anche altre persone possano continuare ad aggiungervi. – eldarerathis

+0

Solo per chiarezza, '(? Im)' abilita due modalità (maiuscole e minuscole); –

2

Quelle sono parentesi non acquisite. Sono usati per il raggruppamento (proprio come le parentesi normali) ma il gruppo non verrà aggiunto all'array di cattura (cioè non sarà referenziabile con \ n).

vedere qui: http://www.regular-expressions.info/refadv.html

7

$ perldoc perlreref:

(?:...) Gruppi sottoespressioni senza catturare (grappolo)

È 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

In breve, la sequenza (? inizia una caratteristica speciale espressione regolare. Le cose che seguono lo (? specificano la funzione speciale, in questo caso, un raggruppamento non catturante. Copriamo questo in Intermedio Perl e Programmazione Perl effettiva. I documenti perlre sono espressioni regolari di Perl.

Problemi correlati