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 "?
"?
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 "?
"?
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:
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"
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)
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.
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). –
@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
Solo per chiarezza, '(? Im)' abilita due modalità (maiuscole e minuscole); –
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
Vedi l'regex tutorial che viene installato con ogni versione di Perl (in particolare, this section).
(?:...)
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 ----------------------------------------------------------------------
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.
Inizio con il più ovvio: perlre (http://perldoc.perl.org/perlre.html). – musiKk
@msw e uno di questi è [questa pagina qui] (http://stackoverflow.com/questions/3890739/what-does-mean-in-this-perl-regex?rq=1). – rightfold