Группы

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Группу в регулярном выражении можно определить с помощью круглых скобок следующим образом:

/class-(\d*)/

Группа является подразделом образца. Группы можно использовать со следующей целью.

  • Для применения квантификатора к нескольким символам.

  • Для отделения подобразцов с целью применения при перестановках (с помощью символа |).

  • Для сбора совпадений подстрок (к примеру, с помощью использования \1 в регулярных выражениях для подбора ранее сопоставленной группы или с помощью применения $1 аналогичным образом в методе replace() класса String).

В следующих разделах подробно описывается использование таких групп.

Использование групп с квалификаторами

Если группа не используется, квантификатор применяется к символу или классу символов, предшествующих ему, как это показано далее:

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

Однако можно использовать группу для применения квантификатора к нескольким символам или классам символов:

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

Дополнительные сведения об этом см. в разделе «Квантификаторы».

Использование групп с символом оператора перестановок (|)

Группы можно использовать для определения групп символов, к которым требуется применить символ оператора перестановок |), как показано ниже:

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

Использование групп для сбора совпадений подстрок

При определении в образце стандартной группы в круглых скобках можно позднее сослаться на нее в регулярном выражении. Такой прием известен под названием обратная ссылка, а такие виды групп известны как группы сбора. Например, в следующем регулярном выражении последовательность \1 соответствует всему, чему соответствует подстрока группы в круглых скобках:

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

В регулярном выражении можно указать до 99 таких обратных ссылок, напечатав \1, \2, ... , \99.

Аналогичным образом в методе replace() класса String можно использовать $1$99 для вставки в замещающую цепочку собранных совпадений подстрок группы:

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

Также при использовании групп сбора метод exec() класса RegExp и метод match() класса String возвращают подстроки, соответствующие группам сбора:

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

Использование групп без сбора и групп просмотра вперед

Группой без сбора является группа, используемая только для образования групп, она не «собирает» и не совпадает с пронумерованными обратными ссылками. Используйте (?: и ) для определения групп без сбора, как показано далее:

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

Например, обратите внимание на разницу между использованием (com|org) в группе сбора по сравнению с использованием в группе без сбора (метод exec() дает перечень групп сбора после полного совпадения):

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

Особым типом группы без сбора является группа просмотра вперед, которая бывает двух типов: позитивная группа просмотра вперед и негативная группа просмотра вперед.

Используйте (?= и ) для определения позитивной группы просмотра вперед, которая задает соответствие подобразца в группе определенному положению. Однако часть строки, соответствующая позитивной группе просмотра вперед, может соответствовать оставшимся образцам в регулярном выражении. Например, поскольку в следующем коде (?=e) является позитивной группой просмотра вперед, символ e, которому она соответствует, может совпадать с последующей частью регулярного выражения, в данном случае группой сбора \w*):

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

Используйте (?! и ) для определения негативной группы просмотра вперед, которая задает отсутствие совпадения подобразца в группе определенному положению. Например:

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

Использование именованных групп

Именованная группа является типом группы в регулярном выражении, которой дан именованный идентификатор. Используйте (?P<name> и ) для определения именованной группы. Например, в состав следующего регулярного выражения входит именованная группа с идентификатором под именем digits:

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

При использовании метода exec() добавляется совпадающая именованная группа в качестве свойства массива 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

Вот другой пример, в котором используются две именованных группы с идентификаторами name и 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
Примечание. Именованные группы не являются частью спецификации языка ECMAScript. Они представляют собой добавленную в ActionScript 3.0 возможность.