我认为@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);
预计到达时间:性能
以下是一些性能比较。
_array
预初始化为小写字符串数组,由 . 分割|
。
_regex
已预初始化为您的正则表达式。
_search
预初始化为要搜索的给定单词。
我正在使用您的单词(包括)以L
- 开头的单词来绕过最大正则表达式长度限制:
每个测试的代码:
正则表达式测试:
_regex.test(_search);
数组.indexOf:
_array.indexOf(_search.toLowerCase()) >= 0;
循环数组:
for (var j:int = 0; j < _array.length; j++)
{
if (_array[j] == _search)
{
break;
}
}
更新:循环,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
.
整个事情的要点是,除了相对复杂的场景外,正则表达式不太可能比定制的解析器/比较器/查找更有效——这适用于所有语言。它被设计为一种通用工具,而不是在每种情况下(或几乎任何情况下)都以最聪明的方式做事。