Поиск подстрок и шаблонов в строках

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

Подстроки — это последовательные символы в строке. Например, строка "abc" имеет следующие подстроки: "", "a", "ab", "abc", "b", "bc", "c". Для нахождения подстрок в строке можно пользоваться методами ActionScript.

В ActionScript шаблоны определяются с помощью строк или регулярных выражений. Например, следующее регулярное выражение определяет конкретный шаблон: за буквами A, B и C следует цифра (косые черты являются разделителями в регулярных выражениях).

/ABC\d/

ActionScript включает методы для поиска шаблонов в строках и для замены найденных соответствий на замещающие подстроки. Эти методы описываются в последующих разделах.

Регулярные выражения позволяют определять довольно сложные шаблоны. Дополнительные сведения см. в разделе «Использование регулярных выражений».

Поиск подстроки по позиции символа

Методы substr() и substring() имеют много общего. Они оба возвращают подстроку заданной строки. Они оба принимают два параметра. В обоих методах первый параметр указывает позицию начального символа в данной строке. Однако в методе substr() вторым параметром является length, содержащий длину возвращаемой подстроки, а в методе substring() — параметр end, содержащий позицию символа в конце подстроки (который не включен в возвращаемую строку). В этом примере демонстрируется различие этих двух методов.

var str:String = "Hello from Paris, Texas!!!"; 
trace(str.substr(11,15)); // output: Paris, Texas!!! 
trace(str.substring(11,15)); // output: Pari

Метод slice() похож на метод substring(). Когда в качестве параметров заданы неотрицательные целые числа, он работает практически так же. Однако метод slice() может принимать в качестве параметров и отрицательные числа. В этом случае позиция символа считается от конца строки, как в следующем примере.

var str:String = "Hello from Paris, Texas!!!"; 
trace(str.slice(11,15)); // output: Pari 
trace(str.slice(-3,-1)); // output: !! 
trace(str.slice(-3,26)); // output: !!! 
trace(str.slice(-3,str.length)); // output: !!! 
trace(str.slice(-8,-3)); // output: Texas

В качестве параметров метода slice() можно указать комбинацию из отрицательного и неотрицательного чисел.

Поиск позиции символа соответствующей подстроки

Методы indexOf() и lastIndexOf() можно использовать для поиска соответствующих подстрок в строке, как в следующем примере.

var str:String = "The moon, the stars, the sea, the land"; 
trace(str.indexOf("the")); // output: 10

Обратите внимание на то, что метод indexOf() учитывает регистр.

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

var str:String = "The moon, the stars, the sea, the land" 
trace(str.indexOf("the", 11)); // output: 21

Метод lastIndexOf() находит последнее вхождение подстроки в строке.

var str:String = "The moon, the stars, the sea, the land" 
trace(str.lastIndexOf("the")); // output: 30

Если для метода lastIndexOf() указать второй параметр, поиск выполняется начиная с заданной позиции в обратном порядке (справа налево).

var str:String = "The moon, the stars, the sea, the land" 
trace(str.lastIndexOf("the", 29)); // output: 21

Создание массива подстрок, разбитых на основе разделителей

С помощью метода split() можно создать массив подстрок, разбитых на основе используемых символов-разделителей. Например, строку, разделенную с помощью запятых или табуляции, можно разбить на несколько подстрок.

В следующем примере показано, как можно разбить массив на подстроки, используя в качестве разделителя амперсанд (&).

var queryStr:String = "first=joe&last=cheng&title=manager&StartDate=3/6/65"; 
var params:Array = queryStr.split("&", 2); // params == ["first=joe","last=cheng"]

Второй, необязательный параметр метода split() определяет максимальный размер возвращаемого массива.

В качестве разделителя можно также использовать регулярное выражение.

var str:String = "Give me\t5." 
var a:Array = str.split(/\s+/); // a == ["Give","me","5."]

Дополнительные сведения см. в разделе «Использование регулярных выражений» и в cправочнике ActionScript® 3.0 для платформы Adobe® Flash® Platform.

Поиск шаблонов в строках и замена подстрок

Класс String включает следующие методы для работы с шаблонами в строках.

  • Методы match() и search() служат для поиска подстрок, соответствующих шаблону.

  • Метод replace() служит для поиска подстрок, соответствующих шаблону, и их замены заданной подстрокой.

Эти методы описываются в последующих разделах.

Для определения шаблонов, используемых в этих методах, можно использовать строки или регулярные выражения. Дополнительные сведения о регулярных выражениях см. в разделе «Использование регулярных выражений».

Поиск соответствующих подстрок

Метод search() возвращает позицию индекса первой подстроки, соответствующей заданному шаблону, как в следующем примере.

var str:String = "The more the merrier."; 
// (This search is case-sensitive.) 
trace(str.search("the")); // output: 9 

Для определения шаблона соответствия можно использовать регулярные выражения, как показано ниже.

var pattern:RegExp = /the/i; 
var str:String = "The more the merrier."; 
trace(str.search(pattern)); // 0

Метод trace() выдает значение 0, так как первый символ в строе имеет позицию индекса 0. В регулярном выражении устанавливается флаг i, чтобы при поиске не учитывался регистр.

Метод search() находит только одно соответствие и возвращает его начальную позицию индекса, даже если в регулярном выражении задан флаг g (global).

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

var pattern:RegExp = /"[^"]*"/; 
var str:String = "The \"more\" the merrier."; 
trace(str.search(pattern)); // output: 4 
 
str = "The \"more the merrier."; 
trace(str.search(pattern)); // output: -1  
// (Indicates no match, since there is no closing double quotation mark.)

Метод match() работает подобным образом. Он выполняет поиск соответствующей подстроки. Однако, когда в шаблоне регулярного выражения установлен флаг global, как в следующем примере, метод match() возвращает массив соответствующих значений.

var str:String = "bob@example.com, omar@example.org"; 
var pattern:RegExp = /\w*@\w*\.[org|com]+/g; 
var results:Array = str.match(pattern);

Массиву result присваивается следующее значение:

["bob@example.com","omar@example.org"]

Дополнительные сведения о регулярных выражениях см. в разделе «Использование регулярных выражений».

Замена совпавших подстрок

С помощью метода replace() можно найти нужный шаблон в строке и заменить соответствия заданной замещающей строкой, как в следующем примере.

var str:String = "She sells seashells by the seashore."; 
var pattern:RegExp = /sh/gi; 
trace(str.replace(pattern, "sch")); //sche sells seaschells by the seaschore. 

Обратите внимание, что в этом примере в совпавших строках не учитывается регистра, так как в регулярном выражении установлен флаг i (ignoreCase), и делается несколько замен, так как установлен флаг g (global). Дополнительные сведения см. в разделе «Использование регулярных выражений».

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

Код с $

Замещающий текст

$$

$

$&

Совпавшая подстрока.

$`

Часть строки, предшествующая совпавшей подстроке. В этом коде используется прямая левая одинарная кавычка (`), а не прямая одинарная кавычка (') или левая фигурная кавычка (').

$'

Часть строки, которая предшествует совпавшей подстроке. Этот код использует прямую одиночную кавычку (').

$n

Зарегистрированное совпадение группы в скобках n, где n — это цифра от 1 до 9, а за $n не следует десятичное число.

$nn

Зарегистрированное совпадение группы в скобках nn, где nn десятичное двузначное число (от 01 до 99). Если запись nn не определена, в качестве замещающего текста используется пустая строка.

Например, ниже показано применение замещающих кодов $2 и $1, представляющих первую и вторую зарегистрированные совпавшие группы:

var str:String = "flip-flop"; 
var pattern:RegExp = /(\w+)-(\w+)/g; 
trace(str.replace(pattern, "$2-$1")); // flop-flip

Также можно использовать функцию в качестве второго параметра метода replace(). Совпавший текст заменяется возвращенным значением функции.

var str:String = "Now only $9.95!"; 
var price:RegExp = /\$([\d,]+.\d+)+/i; 
trace(str.replace(price, usdToEuro)); 
 
function usdToEuro(matchedSubstring:String,                                  capturedMatch1:String,                                  index:int,                                  str:String):String 
{ 
    var usd:String = capturedMatch1; 
    usd = usd.replace(",", ""); 
    var exchangeRate:Number = 0.853690; 
    var euro:Number = parseFloat(usd) * exchangeRate; 
    const euroSymbol:String = String.fromCharCode(8364); 
    return euro.toFixed(2) + " " + euroSymbol; 
}

Когда в качестве второго параметра метода replace() используется функция, ей передаются следующие аргументы:

  • Совпадающая часть строки.

  • Зарегистрированные совпадения группы. Количество переданных таким образом аргументов варьируется в зависимости от количества совпадений в скобках. Количество совпадений в скобках можно определить, проверив значение параметра arguments.length - 3 в коде функции.

  • Позиция в индексе в строке, где начинается совпадение.

  • Строка полностью.