Ricerca…


introduzione

I gruppi regolari non acquisiti consentono al motore di rientrare nel gruppo e tentare di far corrispondere qualcosa di diverso (ad esempio un'alternanza diversa o corrispondere a un numero inferiore di caratteri quando viene utilizzato un quantificatore).

I gruppi atomici differiscono dai gruppi regolari non catturanti in quanto il backtracking è vietato. Una volta che il gruppo è uscito, tutte le informazioni di backtracking vengono scartate, quindi non è possibile tentare corrispondenze alternative.

Osservazioni

Un quantificatore possessivo si comporta come un gruppo atomico in quanto il motore non sarà in grado di tornare indietro su un token o un gruppo.

Quanto segue è equivalente in termini di funzionalità, anche se alcuni saranno più veloci di altri:

a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc

Raggruppamento con (?>)

Utilizzo di un gruppo atomico

I gruppi atomici hanno il formato (?>...) con un ?> Dopo il paren aperto.

Si consideri il seguente testo di esempio:

ABC

La regex tenterà di far corrispondere l'avvio dalla posizione 0 del testo, che è prima di A in ABC .

Se si utilizzava un'espressione senza distinzione tra maiuscole e minuscole (?>a*)abc , il (?>a*) corrispondeva a 1 carattere A , lasciando

BC

come il testo rimanente da abbinare. Il gruppo (?>a*) viene chiuso e viene tentato abc sul testo rimanente, che non corrisponde.

Il motore non è in grado di tornare indietro nel gruppo atomico e quindi il passaggio corrente non riesce. Il motore si sposta nella posizione successiva nel testo, che si troverà nella posizione 1, che è dopo la A e prima della B ABC .

La regex (?>a*)abc viene tentata di nuovo, e (?>a*) corrisponde A 0 volte, lasciando

BC

come il testo rimanente da abbinare. Il gruppo (?>a*) viene chiuso e viene tentato l' abc , che fallisce.

Di nuovo, il motore non è in grado di tornare indietro nel gruppo atomico, e quindi il passaggio corrente fallisce. La regex continuerà a fallire fino a quando tutte le posizioni nel testo sono state esaurite.

Utilizzo di un gruppo non atomico

I gruppi regolari non catturanti hanno il formato (?:...) con un ?: Dopo il paren aperto.

Dato lo stesso testo di esempio, ma con l'espressione senza distinzione tra maiuscole e minuscole (?:a*)abc , si verificherà una corrispondenza poiché è consentito che il backtracking si verifichi.

All'inizio, (?:a*) consumerà la lettera A nel testo

ABC

in partenza

BC

come il testo rimanente da abbinare. Il gruppo (?:a*) viene chiuso e viene tentato abc sul testo rimanente, che non corrisponde.

Il motore fa il backtrack nel gruppo (?:a*) e tenta di abbinare 1 carattere in meno: invece di far corrispondere 1 carattere A , tenta di far corrispondere i caratteri 0 A e il gruppo (?:a*) viene chiuso. Questo lascia

ABC

come il testo rimanente da abbinare. L'espressione regolare abc ora è in grado di abbinare correttamente il testo rimanente.

Altro testo di esempio

Considera questo testo di esempio, con gruppi sia atomici che non atomici (di nuovo, maiuscole e minuscole):

AAAABC

La regex tenterà di AAAABC partire dalla posizione 0 del testo, che è prima della prima A in AAAABC .

Il modello che utilizza il gruppo atomico (?>a*)abc sarà in grado di eguagliarsi, comportandosi in modo quasi identico all'esempio ABC atomico di cui sopra: tutti e 4 i caratteri A vengono prima abbinati a (?>a*) (lasciando BC come testo rimanente da abbinare), e abc non può corrispondere su quel testo. Il gruppo non può essere reinserito, quindi la partita fallisce.

Lo schema che usa il gruppo non atomico (?:a*)abc sarà in grado di eguagliarsi, comportandosi in modo simile all'esempio ABC non atomico di cui sopra: tutti e 4 i caratteri A vengono prima abbinati a (?:a*) (lasciando BC come testo rimanente da abbinare), e abc non può corrispondere su quel testo. Il gruppo è in grado di essere re-inseriti, quindi uno in meno A viene tentata: 3 A caratteri sono abbinati invece di 4 (lasciando ABC come il testo rimanente per abbinare), e abc è in grado di eguagliare con successo su quel testo.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow