Использование переменной в AS3, Regexp - PullRequest
6 голосов
/ 12 июля 2011

Использование Actionscript 3.0 (в Flash CS5)

Стандартное регулярное выражение для сопоставления с любой цифрой:

var myRegexPattern:Regex = /\d/g;

Как будет выглядеть регулярное выражение для включения строковой переменной для сопоставления?(этот пример - «IDEAL», а не «WORKING»), т.е.:

var myString:String = "MatchThisText"
var myRegexPatter_WithString:Regex = /\d[myString]/g;

Я видел несколько обходных путей, которые включают создание нескольких экземпляров регулярных выражений, а затем объединение их по источнику с рассматриваемой переменной, что кажется неправильным.ИЛИ используя флэш-строку для регулярного выражения создателя, но это просто небрежно со всеми необходимыми двойными и тройными escape-последовательностями.

Должен быть какой-то безболезненный способ, которого я не могу найти в живых документах или в Google,AS3 держит эту функциональность даже?Если нет, то это действительно должно быть.

Или я упускаю гораздо более простое средство, чтобы просто избежать этой задачи, которую я просто наивен из-за своей новизны в регулярных выражениях?

Ответы [ 2 ]

9 голосов
/ 12 июля 2011

Я действительно писал об этом в блоге, поэтому я просто укажу вам: http://tyleregeto.com/using-vars-in-regular-expressions-as3 В нем говорится о возможных решениях, но нет идеального, как вы упомянули.

РЕДАКТИРОВАТЬ

Вот копия важных частей этой записи в блоге:

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

/<("[^"]*"|'[^']*'|[^'">])*>/ig

Это изящное выражение работает как шарм.Но я хотел обновить его, чтобы разработчик мог ограничить, какие теги он удаляет, указанными в массиве.Довольно простые вещи: чтобы использовать значение переменной в регулярном выражении, сначала нужно построить его как строку, а затем преобразовать.Что-то вроде следующего:

var exp:String = 'start-exp' + someVar + 'more-exp';
var regex:Regexp = new RegExp(exp);

Довольно прямо.Так что, приближаясь к этому небольшому обновлению, я так и сделал.Конечно, одна большая проблема была довольно ясна.

var exp:String = '/<' + tag + '("[^"]*"|'[^']*'|[^'">])*>/';

Угадайте, что, недопустимая строка!Лучше избегать этих кавычек в строке.Упс, это сломает регулярное выражение!Я был в тупике.Поэтому я открыл справочник по языку, чтобы посмотреть, что я смог найти.Параметр «source» (который я никогда раньше не использовал) попался на глаза.Возвращает строку, описанную как «часть шаблона регулярного выражения».Это отлично сработало.Вот решение:

var start:Regexp = /])*>/ig;
var complete:RegExp = new RegExp(start.source + tag + end.source);

Вы можете уменьшить его до этого для удобства:

var complete:RegExp = new RegExp(/])*>/.source + tag, 'ig');
6 голосов
/ 12 июля 2011

Как правильно указывает Тайлер (и его ответ работает отлично), вы можете собрать свое регулярное выражение как конец строки, а затем передать эту строку в конструктор RegExp с синтаксисом new RegExp("pattern", "flags").

function assembleRegex(myString) {
    var re = new RegExp('\\d' + myString, "i");
    return re;
}

Обратите внимание, что при использовании строки для хранения шаблона регулярного выражения вам необходимо добавить несколько дополнительных обратных косых черт, чтобы заставить его работать правильно (например, чтобы получить \d в регулярном выражении, необходимо указать \\d в строке).Также обратите внимание, что строковый шаблон не использует разделители прямой косой черты.Другими словами, следующие два оператора эквивалентны:

var re1 = /\d/ig;
var re2 = new Regexp("\\d", "ig");

Дополнительное примечание: вам может потребоваться обработать переменную myString, чтобы избежать любых обратных косых черт, которые она может содержать (если они должны интерпретироваться как литеральные),Если это так, функция становится:

function assembleRegex(myString) {
    myString = myString.replace(/\\/, '\\\\');
    var re = new RegExp('\\d' + myString);
    return re;
}
...