Gruppi

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

Per specificare un gruppo all'interno di un'espressione regolare si possono usare le parentesi, come nell'esempio seguente:

/class-(\d*)/

Un gruppo è un segmento di un modulo. I gruppi permettono di:

  • applicare un quantificatore a più caratteri;

  • delineare moduli secondari da applicare alternativamente (usando il carattere | );

  • catturare corrispondenze a sottostringhe (ad esempio, usando \1 in un'espressione regolare per trovare un gruppo trovato in precedenza o usando $1 in modo simile al metodo replace() della classe String).

Le sezioni seguenti forniscono alcuni dettagli sull'uso dei gruppi.

Uso di gruppi e di quantificatori

Se non sono stati definiti dei gruppi, il quantificatore si riferisce al carattere o alla classe di caratteri che lo precede, come illustra l'esempio seguente:

var pattern:RegExp = /ab*/ ; 
// matches the character a followed by 
// zero or more occurrences of the character b 
 
pattern = /a\d+/;  
// matches the character a followed by  
// one or more digits 
 
pattern = /a[123]{1,3}/; 
// matches the character a followed by  
// one to three occurrences of either 1, 2, or 3

Tuttavia, definendo un gruppo è possibile applicare un quantificatore a più di un carattere o a più di una classe di caratteri:

var pattern:RegExp = /(ab)*/; 
// matches zero or more occurrences of the character a  
// followed by the character b, such as ababab 
 
pattern = /(a\d)+/; 
// matches one or more occurrences of the character a followed by  
// a digit, such as a1a5a8a3 
 
pattern = /(spam ){1,3}/;  
// matches 1 to 3 occurrences of the word spam followed by a space

Per ulteriori informazioni sui quantificatori, vedete Quantificatori .

Uso dei gruppi con il carattere di alternanza (|)

I gruppi consentono di definire una serie di caratteri a cui applicare il carattere di alternanza ( | ), nel modo seguente:

var pattern:RegExp = /cat|dog/; 
// matches cat or dog 
 
pattern = /ca(t|d)og/; 
// matches catog or cadog

Uso dei gruppi per rilevare corrispondenze a sottostringhe

Se all'interno di un modello definite un gruppo parentetico standard, potete aggiungere dei riferimenti al gruppo in un punto successivo dell'espressione regolare. Questi tipi di riferimenti sono definiti a posteriori e questi tipi di gruppi sono conosciuti come gruppi di cattura . Ad esempio, nell'espressione regolare seguente, la sequenza \1 corrisponde alla sottostringa individuata dal gruppo di cattura parentetico:

var pattern:RegExp = /(\d+)-by-\1/; 
// matches the following: 48-by-48

All'interno di un'espressione regolare potete specificare fino a 99 riferimenti a posteriori digitando \1 , \2 , \99 .

Analogamente, nel metodo replace() della classe String, potete usare $1$99 - per inserire nella stringa di sostituzione corrispondenze a sottostringhe dei gruppi catturati:

var pattern:RegExp = /Hi, (\w+)\./; 
var str:String = "Hi, Bob."; 
trace(str.replace(pattern, "$1, hello.")); 
  // output: Bob, hello.

Inoltre, quando usate i gruppi di cattura, il metodo exec() della classe RegExp e il metodo match() della classe String restituiscono sottostringhe che corrispondono ai gruppi di cattura:

var pattern:RegExp = /(\w+)@(\w+).(\w+)/; 
var str:String = "bob@example.com"; 
trace(pattern.exec(str)); 
  // bob@example.com,bob,example,com

Uso dei gruppi di non cattura e dei gruppi lookahead

Un gruppo di non cattura è un semplice costrutto di raggruppamento che non viene raccolto e fa riferimento a corrispondenze precedenti. Usate (?: e ) per definire i gruppi di non cattura come descritto di seguito:

var pattern = /(?:com|org|net);

Ad esempio, notate la differenza che esiste tra inserire (com|org) in un gruppo di cattura e inserirlo in un gruppo di non cattura (il metodo exec() elenca i gruppi di cattura dopo una corrispondenza completa):

var pattern:RegExp = /(\w+)@(\w+).(com|org)/; 
var str:String = "bob@example.com"; 
trace(pattern.exec(str)); 
// bob@example.com,bob,example,com 
 
//noncapturing: 
var pattern:RegExp = /(\w+)@(\w+).(?:com|org)/; 
var str:String = "bob@example.com"; 
trace(pattern.exec(str)); 
  // bob@example.com,bob,example

Il gruppo lookahead è un tipo speciale di gruppo di non cattura, di cui esistono due tipi: il gruppo lookahead positivo e il gruppo lookahead negativo .

Per definire un gruppo lookahead positivo, usate (?= e ) , che specifica che il sottomodello del gruppo deve corrispondere alla posizione. Tuttavia, la porzione di stringa che corrisponde al gruppo lookahead positivo può corrispondere agli altri modelli dell'espressione regolare. Ad esempio, dal momento che nel frammento di codice seguente, (?=e) è un gruppo lookahead positivo, il carattere e individuato può essere individuato anche da porzioni successive dell'espressione regolare, in questo caso dal gruppo di cattura \w*) :

var pattern:RegExp = /sh(?=e)(\w*)/i; 
var str:String = "Shelly sells seashells by the seashore"; 
trace(pattern.exec(str)); 
// Shelly,elly

Per definire un gruppo lookahead negativo, usate (?! e ) che specificano che il sottomodello del gruppo non deve corrispondere alla posizione. Ad esempio:

var pattern:RegExp = /sh(?!e)(\w*)/i; 
var str:String = "She sells seashells by the seashore"; 
trace(pattern.exec(str)); 
// shore,ore

Uso di gruppi denominati

Un gruppo denominato di un'espressione regolare è un gruppo a cui è stato assegnato un nome. Per definire un gruppo denominato, usate (?P<nome> e ) . L'espressione regolare dell'esempio seguente contiene il gruppo denominato digits :

var pattern = /[a-z]+(?P<digits>\d+)[a-z]+/;

Quando usate il metodo exec() , un gruppo denominato corrispondente viene aggiunto come proprietà dell'array result :

var myPattern:RegExp = /([a-z]+)(?P<digits>\d+)[a-z]+/;  
var str:String = "a123bcd"; 
var result:Array = myPattern.exec(str); 
trace(result.digits); // 123

Segue un altro esempio che contiene due gruppi denominati ( name e dom ):

var emailPattern:RegExp =  
    /(?P<name>(\w|[_.\-])+)@(?P<dom>((\w|-)+))+\.\w{2,4}+/;  
var address:String = "bob@example.com"; 
var result:Array = emailPattern.exec(address); 
trace(result.name); // bob 
trace(result.dom); // example
Nota: i gruppi denominati non fanno parte della specifica del linguaggio ECMAScript. Sono una funzione speciale di ActionScript 3.0.