2

单词列表很长,我无法在此处粘贴错误的实际代码。正则表达式白名单中有大约 4500 个单词,由 | 分隔。

正则表达式、白名单白名单2 都包含单词hello,但每个测试返回不同的结果,我不知道为什么在使用 javascript 测试相同的结果后给出正确的结果。

这是用于测试的动作脚本。白名单行可能不完全可见,请尝试在文本/代码编辑器中复制粘贴以下链接中的代码。 http://wonderfl.net/c/jTmb/

Edit1:我面临的问题是有时单词不完全匹配。示例星期六需要匹配星期六。这就是我使用正则表达式的原因。

关于字符串长度。我试图检查字符串的长度并正确报告它。 http://wonderfl.net/c/a9yp/

Edit2:测试显示它在 javascript http://tinyurl.com/m74hmdj中有效

4

2 回答 2

1

实际答案...

这个问题让我第一次发现了一些有趣的 AS3 限制......

您的正则表达式以“metabrushite”一词的长度失败。据我从各种测试中得知,这是它达到 AS3 中正则表达式支持的最长长度的地方:31391 characters。任何比这更长的正则表达式似乎总是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 中排除,因此从未执行。

于 2013-08-09T14:09:44.220 回答
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);

预计到达时间:性能

以下是一些性能比较。

  • _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.

整个事情的要点是,除了相对复杂的场景外,正则表达式不太可能比定制的解析器/比较器/查找更有效——这适用于所有语言。它被设计为一种通用工具,而不是在每种情况下(或几乎任何情况下)都以最聪明的方式做事。

于 2013-08-09T12:12:06.777 回答