CakeFest 2024: The Official CakePHP Conference

Sotto-regole

Le sotto-regole sono delimitate dalle parentesi tonde e possono essere annidate. La definizione di una parte di una regola di riconoscimento come sotto-regola può servire a:

  1. Localizzare un set di alternative. Ad esempio il criterio cat(aract|erpillar|) riconosce una tra le parole "cat", "cataract" oppure "caterpillar". Se non fossero state usate le parentesi, il criterio avrebbe riconosciuto "cataract", "erpillar" oppure una stringa vuota.

  2. Identificare e catturare parte del testo riconosciuto dalla sotto-regola (come illustrato in seguito). Quando il riconoscimento dell'intero criterio ha avuto successo, le porzioni della stringa oggetto della ricerca identificate dalle sotto-regole sono restituite alla funzione chiamante tramite l'argomento vettore della funzione pcre_exec(). Per determinare il numero ordinale di ciascuna sotto-regola si contano le parentesi aperte da sinistra verso destra partendo da 1.

Ad esempio, se si esegue un riconoscimento nella frase "the red king" con il seguente criterio the ((red|white) (king|queen)) si ottengono i testi "red king", "red" e "king", rispettivamente identificati dalla sotto-regola 1, 2 e 3.

Il fatto che le parentesi tonde adempiano a due funzioni non sempre porta a situazioni comprensibili. Spesso capita di dovere raggruppare delle sotto-regole senza per questo essere richiesta la cattura del testo. A tale scopo l'uso della sequenza "?:" dopo la parentesi di apertura permette di indicare che questa sotto-regola non deve catturare il testo, e non deve essere conteggiata nel numero d'ordine delle sotto-regole di cattura. Ad esempio, applicando il criterio the ((?:red|white) (king|queen)) alla frase "the white queen", si catturano i testi "white queen" e "queen", rispettivamente numerati 1 e 2. Il numero massimo di testi catturabili è 99, il numero massimo di sotto-regole, a prescindere che siano di cattura o meno, è 200.

Come utile abbreviazione, nei casi in cui l'attivazione di alcune opzioni debba essere fatta all'inizio di una sotto-regola non di cattura, la lettera dell'opzione può comparire tra la "?" e ":". Pertanto i due criteri

(?i:saturday|sunday)
(?:(?i)saturday|sunday)

riconoscono esattamente lo stesso set di parole. Poiché i rami alternativi sono provati da sinistra verso destra, e le opzioni non sono azzerate fino a quando non si è conclusa la sotto-regola, una opzione attivata in un ramo alternativo si applica a tutte le alternative che seguono. Pertanto, nell'esempio di prima, sia la parola "SUNDAY" che la parola "Saturday" sono testi identificati correttamente.

È possibile dare un nome ad una sottoregola usando la sintassi (?P<name>pattern). Questa sottoregola sarà quindi indicizzata nella matrice dei riconoscimenti attraverso la sua posizione numerica e anche attraverso il nome. PHP 5.2.2 ha introdotto due sintassi alternative (?<name>pattern) e (?'name'pattern).

Qualche volta è necessario avere riconoscimenti multipli, ma con sottogruppi alternativi nell'espressione regolare. Normalmente, ad ognuno di questi verrebbe dato un numero di riferimento anche se solo uno di essi verrà in effetti riconosciuto. Per ovviare a questa situazione, la sintassi (?| permette di avere numeri duplicati. Si consideri la seguente espressione eseguita rispetto alla stringa Sunday:

(?:(Sat)ur|(Sun))day

In questo caso Sun è salvato nel riferimento 2, mentre il riferimento 1 è vuoto. La ricerca metterà Sat nel riferimento 1 mentre il riferimento 2 non esiste. La soluzione è cambiare la regola usando (?|:

(?|(Sat)ur|(Sun))day

Utilizzando questa regola, sia Sun che Sat sono inseriti nel riferimento 1.

add a note

User Contributed Notes 1 note

up
-2
mike at eastghost dot com
9 years ago
(?:(?!string).)

?: makes a subpattern

?! is a negative look-ahead.

Putting negative look-ahead before the dot causes regex engine to first find any occurrence of the negative look-ahead string, and only then, if the negative look-ahead string is not present, should an arbitrary character (due to the dot) match.
To Top