2010-04-16 25 views
12

Fine di ancoraggio linea $ partita anche lì è extra trailing \n nella stringa corrispondente, quindi usiamo \Z invece di $Quando dovrei usare A in un'espressione regolare?

Per esempio

^\w+$ corrisponderà alla stringa abcd\n ma ^\w+\Z non è

Come circa \A e quando usare?

+0

Non intendi '^ \ w + \ z' (minuscolo z)? '\ Z' e' $ 'sono gli stessi (quando non usi il modificatore'/m'). – cjm

+0

@cjm, ho provato su python e IMHO, non è lo stesso, '^ \ w + \ Z' non corrisponde a' abcd \ n', ma $ lo fa, ma non sono sicuro dell'implementazione regex di python e perl di '\ Z 'è diverso, ma in python' \ Z' e '\ z' sono uguali, (penso perché non vedo' \ z' nei documenti python), non ho perl al momento. – YOU

+0

@cjm, ho appena provato su codepad.org, sì, il '\ Z' in python intendo è' \ z' in perl, pensavo fossero uguali in entrambi i linguaggi. – YOU

risposta

20

Il più delle volte viene utilizzato quando si abilitano anche le partite su più righe. Dal \A corrisponde solo all'inizio del testo INTERO, a differenza dell'inizio di una riga, in espressioni regolari che possono corrispondere su tutte le linee le funzionalità di ^ e \A sono diverse.

+0

+1 grazie, ma la gente lo usa davvero? Non sta rimuovendo '/ m' e l'uso di'^'è lo stesso comportamento? – YOU

+0

Sì, lo uso. Pensa di provare a cercare una stringa che TU non prevede di avere nuove linee incorporate, ma che un utente le ha inserite. Ti aspetti di poter cercare l'intera stringa ma^e $ si confondono e analizzano solo la prima parte della stringa . Si potrebbe finire per iniettare del codice malvagio in una query o memorizzarlo in un database. Sì, è confuso ma \ m, \ A, \ z,^e $ hanno i loro usi quindi è necessario capire quando e dove usarli. Forse non è un buon esempio, ma può essere davvero importante. Forse qualcuno può aggiungere alcuni esempi del mondo reale. –

+0

Se si sta tentando, ad esempio, di abbinare una particolare coppia di righe all'inizio di un file di log all'interno di un set di log, è necessario avere la corrispondenza multi-linea abilitata, ma non si può semplicemente usare '^' (dal momento che vuoi sincronizzare le righe all'inizio del file di registro, non nel mezzo). Quello sarebbe un potenziale caso d'uso. – Amber

4

Come con qualsiasi funzione di regex, lo si utilizza quando descrive più esattamente ciò che è necessario in contrapposizione a qualsiasi funzione più generale. Se si sa che si desidera corrispondere esattamente all'inizio di una stringa (anziché le righe logiche), utilizzare la funzione regex che lo descrive. Non utilizzare funzionalità regex che potrebbero corrispondere in situazioni che non si desidera.

per il Perl, vedere le perlre documentazione per i dettagli sulle asserzioni di lunghezza zero:

\b Match a word boundary 
\B Match except at a word boundary 
\A Match only at beginning of string 
\Z Match only at end of string, or before newline at the end 
\z Match only at end of string 
\G Match only at pos() (e.g. at the end-of-match position 
    of prior m//g) 
2

Non direttamente rilevanti per la tua domanda in base ai tag che hai usato, ma c'è almeno una lingua (Ruby) dove ^ e $sempre significa inizio/fine-of-line, quindi se si desidera far corrispondere inizio/fine-di-stringa che si deve usare \A e \Z o \z.

Se si desidera mantenere i regex portatile, è buona norma dichiarare esplicitamente ciò che si vuole loro di fare invece di fare affidamento sulla disponibilità di modificatori di modalità come \m o Regex.MULTILINE ecc

D'altra parte, JavaScript , POSIX e XML non supportano \A e \Z. È qui che gli strumenti come RegexBuddy sono utili per tradurre le espressioni regolari da un sapore all'altro per te.

+0

Grazie per le informazioni su Ruby regex, +1 – YOU

2

Se si utilizza il supporto per l'espressione regolare con i supporti \A, si consiglia di utilizzarlo sempre al posto di ^. \A corrisponde sempre all'inizio della stringa solo in tutti i sapori che lo supportano. Non ci sono problemi con le interruzioni di riga.

^ può corrispondere all'inizio della stringa solo o all'inizio di qualsiasi riga in base alle opzioni di espressione regolare e regex.

Utilizzando \A si riduce il rischio di confusione quando qualcun altro deve mantenere il proprio codice.

+0

Grazie per i suggerimenti Jan Goyvaerts, questo è sensato – YOU

Problemi correlati