Флаги и свойства

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

В следующей таблице представлены пять флагов, которые можно установить для регулярных выражений. Каждый флаг можно оценить как свойство объекта регулярного выражения.

Флаг

Свойство

Описание

g

global

Соответствует нескольким совпадениям.

i

ignoreCase

Совпадение без учета регистра. Применяется к символам A Z и a z , но не к расширенным символам, таким как É и é .

m

multiline

Когда этот флаг установлен, символы $ и ^ могут соответствовать началу и концу строки соответственно.

s

dotall

Когда этот флаг установлен, символ . (точка) может соответствовать символу новой строки ( \n ).

x

extended

Разрешает расширенные регулярные выражения. В состав регулярного выражения можно ввести пробелы, которые не рассматриваются как часть образца. Благодаря этому код регулярного выражения может быть более четким.

Следует отметить, что эти свойства доступны только для чтения. Когда задается переменная регулярного выражения, установить флаги ( g , i , m , s , x ) можно следующим образом:

var re:RegExp = /abc/gimsx;

Однако именованные свойства нельзя задать напрямую. К примеру, следующий код привел к появлению ошибки:

var re:RegExp = /abc/; 
re.global = true; // This generates an error.

По умолчанию, пока они не будут заданы в объявлении регулярного выражения, флаги не будут установлены и соответствующие свойства будут также установлены на false .

Кроме того, существуют два других свойства регулярного выражения.

  • Свойство lastIndex определяет положение указателя в строке с целью использования для следующего вызова метода exec() или test() регулярного выражения.

  • Свойство source определяет строку, которая, в свою очередь, определяет часть образца регулярного выражения.

Флаг g (global)

Если флаг g ( global ) не установлен, регулярное выражение имеет не более одного совпадения. Например, если в регулярном выражении флаг g не установлен, метод String.match() возвращает только одну совпадающую подстроку:

var str:String = "she sells seashells by the seashore."; 
var pattern:RegExp = /sh\w*/; 
trace(str.match(pattern)) // output: she

Если флаг g установлен, метод Sting.match() возвращает несколько совпадений, как показано далее:

var str:String = "she sells seashells by the seashore."; 
var pattern:RegExp = /sh\w*/g; 
// The same pattern, but this time the g flag IS set. 
trace(str.match(pattern)); // output: she,shells,shore

Флаг i (ignoreCase)

По умолчанию совпадения регулярных выражений учитывают регистр. Если установлен флаг i ( ignoreCase ), регистр не учитывается. Например, в регулярных выражениях буква s нижнего регистра не соответствует букве S верхнего регистра, первому символу строки:

var str:String = "She sells seashells by the seashore."; 
trace(str.search(/sh/)); // output: 13 -- Not the first character

Однако, если установлен флаг i , регулярное выражение не соответствует заглавной букве S :

var str:String = "She sells seashells by the seashore."; 
trace(str.search(/sh/i)); // output: 0

Флаг i не учитывает регистр только в случае с символами A Z и a z , за исключением расширенных символов, таких как É и é .

Флаг m (multiline)

Если флаг m ( multiline ) не установлен, символ ^ соответствует началу строки, а символ $ — концу строки. Если флаг m установлен, эти символы соответствуют началу и концу строки соответственно. Рассмотрим следующую строку, в состав которой входит символ начала строки:

var str:String = "Test\n"; 
str += "Multiline"; 
trace(str.match(/^\w*/g)); // Match a word at the beginning of the string.

Несмотря на то что в регулярном выражении установлен флаг g ( global ), метод match() соответствует только одной подстроке, поскольку для символа ^ существует только одно совпадение, которым является начало строки. Получены следующие результаты:

Test

Вот такой же код с установленным флагом m :

var str:String = "Test\n"; 
str += "Multiline"; 
trace(str.match(/^\w*/gm)); // Match a word at the beginning of lines. 

В этот раз результат включает слова в начале обеих строк:

Test,Multiline

Следует отметить, что только символ \n обозначает конец строки. Следующие символы не обозначают конец строки.

  • Символ ( \r ) возврата

  • Символ ( \u2028 ) разделителя строк юникода

  • Символ ( \u2029 ) разделителя абзацев юникода

Флаг s (dotall)

Если флаг s ( dotall или «dot all») не установлен, точка ( . ) в образце регулярного выражения не соответствует символу начала строки ( \n ). Поэтому для следующего примера совпадение отсутствует:

var str:String = "<p>Test\n"; 
str += "Multiline</p>"; 
var re:RegExp = /<p>.*?<\/p>/; 
trace(str.match(re)); 

Однако, если флаг s установлен, точка соответствует символу начала строки:

var str:String = "<p>Test\n"; 
str += "Multiline</p>"; 
var re:RegExp = /<p>.*?<\/p>/s; 
trace(str.match(re)); 

В этом случае совпадением является вся подстрока внутри тегов <p> , включая символ начала строки:

<p>Test 
Multiline</p>

Флаг x (extended)

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

/<p(>|(\s*[^>]*>)).*?<\/p>/gi

При использовании в регулярном выражении флага x ( extended ) все пробелы, введенные в образец, игнорируются. Например, следующее регулярное выражение идентично предыдущему примеру:

/     <p    (>  | (\s* [^>]* >))    .*?    <\/p>  /gix

Если флаг x установлен и нет необходимости в совпадении символа пробела, поставьте перед пробелом обратную косую черту. Например, эквивалентными являются следующие два регулярных выражения:

/foo bar/ 
/foo \ bar/x

Свойство lastIndex

Свойство lastIndex определяет позицию указателя в строке, с которой должен начинаться следующий поиск. Это свойство влияет на методы exec() и test() , вызываемые в регулярном выражении, в котором для флага g установлено значение true . Например, рассмотрим следующий код:

var pattern:RegExp = /p\w*/gi; 
var str:String = "Pedro Piper picked a peck of pickled peppers."; 
trace(pattern.lastIndex); 
var result:Object = pattern.exec(str); 
while (result != null) 
{ 
    trace(pattern.lastIndex); 
    result = pattern.exec(str); 
}

По умолчанию для свойства lastIndex установлено значение 0 (чтобы поиск начинался в начале строки). После каждого совпадения для свойства задается положение указателя, следующее за совпадением. Поэтому результат для предшествующего кода выглядит следующим образом:

0 
5 
11 
18 
25 
36 
44

Если для флага global задано значение false , методы exec() и test() не используют свойство lastIndex .

Методы match() , replace() и search() класса String всегда начинают поиск с начала строки, несмотря на использование свойства lastIndex регулярного выражения, применяемого при вызове метода. (Однако метод match() не задает для свойства lastIndex значение 0.)

Свойство lastIndex можно установить так, чтобы скорректировать начальную позицию в строке для поиска совпадений регулярных выражений.

Свойство source

Свойство source определяет строку, которая, в свою очередь, определяет часть образца регулярного выражения. Например:

var pattern:RegExp = /foo/gi; 
trace(pattern.source); // foo