单词列表很长,我无法粘贴这里错误的实际代码。 正则表达式白名单中有大约4500个单词,由|
分隔正则表达式,白名单和 whitelist2 都包含 hello 这个词,但每个的测试都返回不同的结果,我不知道为什么之后用javascript测试相同的结果。
这是测试的动作脚本。 白名单的行可能无法完全显示,请尝试从文本/代码编辑器中的下面的链接复制粘贴代码。 http://wonderfl.net/c/jTmb/
Edit1:我面临的问题是,有时这些单词并不完全匹配。 周六的例子需要与周六相匹配。 这就是我使用正则表达式的原因。
关于字符串长度。 我试图检查字符串的长度并正确报告。 http://wonderfl.net/c/a9yp/
EDIT2: 测试显示它在JavaScript中工作 http://tinyurl.com/m74hmdj
答案 0 :(得分:1)
实际答案......
这个问题让我第一次发现了一些有趣的AS3限制......
你的正则表达式在“metabrushite”这个词的长度上失败了。据我所知,从各种测试来看,它是AS3中正则表达式支持最长支持长度的地方: 31391个字符。任何长于此的正则表达式似乎总是在false
的调用中返回test()
。请注意,“hello”出现在“metabrushite”之前的列表中,所以这不是截断的问题 - 正则表达式根本无法完全无法工作 - 例如一个应该总是返回所有单词的true
的正则表达式,如果它长那么仍会返回false
。
这个限制似乎是一个相当随意的数字,所以很难确切说明是什么造成了这个限制。
同样,你真的不应该使用正则表达式来完成这样的任务,但如果你觉得你有,你需要把它分成几个正则表达式,每一个都是不要超过最大长度。
旁注:
另一个有趣的事情,我没有仔细研究过,是从单语句连接字符串创建RegExp
,即:
trace("You'll never see this traced if too many words are added below.");
var s:String = "firstword|" +
"secondword|" +
... +
"lastword";
...即使是更短的结果字符串也会失败。这似乎是由于单个语句的长度施加的最大长度,并且与正则表达式无关。它没有冻结;它不输出错误甚至是第一个trace
。该脚本只是默默地从swf中排除,因此从未执行过。
答案 1 :(得分:0)
我在想@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);
array.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
可能会略微提高速度。
这一切的重点在于,除了相对复杂的场景外,正则表达式不一定比定制的解析器/比较器/查找更有效 - 适用于所有语言。它被设计成一个通用的工具,不是在每种情况下以最聪明的方式做事(或几乎任何情况下)。