Я думаю @tsiki прямо о максимальной длине AS3 регулярных выражений.
Это действительно комментарий, но так как я хотел бы включить немного кода, я ставлю его в качестве ответа:
Поскольку вы не используете регулярное выражение для чего-либо, кроме списка слов, разделенных |
, рассмотрите возможность использования массива. Другим преимуществом этого подхода является то, что он будет довольно быстрым.
// This is just a way of reusing your list,
// rather than manually transforming it to an array:
var whitelist:Array = "abasement|abastardize|abastardize|..."
.split("|");
// Simply use .toLowerCase() on the input string to make it case insensitive,
// assuming all your whitelist words are lower case.
trace(whitelist.indexOf("hello") >= 0);
ETA: Производительность
Вот некоторые сравнения производительности.
_array
предварительно инициализируется строчной массив строк, расщепленного |
.
_regex
предварительно инициализирован вашим регулярным выражением.
_search
предварительно инициализирован заданным словом для поиска.
Я использую ваши слова до (включительно) слова, начинающиеся с L
- обойти ограничения максимальной длины регулярного выражения:
Код для каждого теста:
regex.test:
_regex.test(_search);
массив.IndexOf:
_array.indexOf(_search.toLowerCase()) >= 0;
цикл по массиву:
for (var j:int = 0; j < _array.length; j++)
{
if (_array[j] == _search)
{
break;
}
}
Update: петля, IndexOf (проверить, если строка поиска подстроки элемента в белый список):
for (var j:int = 0; j < _array.length; j++)
{
if (_search.indexOf(array[j]) !== -1)
{
break;
}
}
AS3 компилятор не делает никакой несправедливой оптимизации этого простого кода (например, пропуски выполнения из-за не использования результата - это не все так умно).
10 трасс, 1000 итераций каждый, FP 11.4.402.278 - релиз версия:
Method Search for Avg. Min Max Iter.
---------------------------------------------------------------------------
array.indexOf "abasement" 0.0 ms 0 ms 0 ms 0 ms
regex.test "abasement" 18.4 ms 14 ms 22 ms 0.0184 ms
loop over array "abasement" 0.0 ms 0 ms 0 ms 0 ms
loop, indexOf "abasement" 0.0 ms 0 ms 0 ms 0 ms
array.indexOf "hello" 31.1 ms 25 ms 42 ms 0.0311 ms
regex.test "hello" 326.8 ms 309 ms 347 ms 0.3268 ms
loop over array "hello" 59.4 ms 50 ms 69 ms 0.0594 ms
loop, indexOf "hello" 97.4 ms 92 ms 105 ms 0.0974 ms
Avg. = average time for the 1000 iterations in each run
Min = Minimum time for the 1000 iterations in each run
Max = Maximum time for the 1000 iterations in each run
Iter. = Calculated time for a single iteration on average
Это совершенно ясно, что цикл по массиву и сравнения каждого значения быстрее, чем при использовании регулярных выражений. Вы могли бы провести справедливое сравнение, прежде чем оно догонило бы время, которое проводит сравнение регулярных выражений. И в любом случае мы имеем дело с долями миллисекунд для одного поиска - это действительно преждевременная оптимизация, если вы не выполняете сотни запросов за короткий промежуток времени. Если мы были говорить оптимизации, Vector.<String>
может ускорить вещи немного больше, по сравнению с Array
.
Главное в этом состоит в том, что, за исключением относительно сложных сценариев, регулярное выражение вряд ли будет более эффективным, чем адаптированный парсер/сопоставление/поиск - который подходит для всех языков. Он разработан как инструмент общего назначения, а не для того, чтобы делать все самое умное в каждом случае (или почти в любом случае, если на то пошло).
На некоторых форумах я видел, что он сказал, что максимальное количество символов в строке ActionScript равно 1022. Может быть, это мешает? – tsiki
Ох. Я думал, что это может быть некоторое ограничение на длину строки в actionscript. 1-й день попыток что-то в actionscript .. Спасибо, посмотрим. –
О строке длина. Вероятно, вы вряд ли ударите максимальную длину строки AS3 - это 2 гигабайта - не помню, если это в UTF-16, что составило бы не менее 1 миллиарда символов. – JimmiTh