使用regex从数组中获取项目

时间:2012-08-03 17:02:19

标签: regex actionscript-3

我正在使用动作脚本,我有一个超过400.000字符串的数组,现在我正在使用循环并对数组的每个项目应用正则表达式来检查它是否有效或不。如果它有效,我将这个项目放在结果数组中。

这个过程耗时太长,所以这很麻烦,因为所有过程都必须执行多次。

我一直在考虑是否有任何其他方式(更快)我可以使用正则表达式来应用所有项目而不使用循环。

任何人都可以给我一个想法吗?

修改

这里我附上了使用的代码:

            var list:Array;
        var list_total:Array = new Array;
        var pattern:String = '^['+some_letters+']{'+n+'}$';
        var cleanRegExp:RegExp = new RegExp(pattern, 'gi');

        for (var i:int=0; i<_words.length; i++) {
            list = _words[i].match(cleanRegExp);
            if (list != null)
                for (var j:int=0; j < list.length; j++)
                    list_total.push(list[j]);
        }

感谢。

2 个答案:

答案 0 :(得分:0)

这不是一个完整的答案,但可以帮助您优化代码。

尝试在循环中尽可能高效地执行操作。使用全局getTimer()函数计时,以便比较哪些方法最有效。在测量/比较时,您可能需要多次触发代码,以便明显区分这些差异。

// before test
var startTime:Number = getTimer();
// do the expensive operation
var endTime:Number = getTimer();
trace("operation took ", endTime - startTime, " milliseconds.");

例如,一个改进是在for循环中,是每次都不查询数组的长度:

for (var i:int = 0; i < myArray.length; i++)

相反,将长度存储在数组外部的局部变量中并使用:

var length:int = myArray.length;
for (var i:int = 0; i < length; i++)

区别很小,但从局部变量访问长度比从阵列获取长度要快。

您可以测试的另一件事是正则表达式本身。尝试提出替代表达式,或使用备用函数。我不记得具体细节,但在一个项目中我们确定(在我们的例子中)使用RegEx.test()方法是这样做比较的最快方法。这可能与String.match()一样快 - 但除非你测量这些东西,否则你不会知道。

Grant Skinner在他的网站上提供了一些很棒的资源。他们值得一读。这个slide show/presentation on performance值得一看。使用箭头键更改幻灯片。

修改

在没有听到格兰特的演讲的情况下,最初的幻灯片似乎并不那么有趣。但是,它在幻灯片#43周围变得非常有趣(具体的代码示例):http://gskinner.com/talks/quick/#43

答案 1 :(得分:0)

我认为没有任何好方法可以避免使用循环。 可以进一步优化循环。

  1. 像已经建议的那样,将数组长度读取到var,这样循环就不必每次迭代检查长度。
  2. 使用concat将列表数组连接到lists_total,而不是嵌套循环。我不确定这实际上是否更快。我想这取决于正则表达式获得多少匹配。
  3. 以下是修改后的代码。

        var list:Array;
        var list_total:Array = new Array;
        var pattern:String = '^['+some_letters+']{'+n+'}$';
        var cleanRegExp:RegExp = new RegExp(pattern, 'gi');
        var wordsLength:int = _words.length;
        for (var i:int=0; i<wordsLength; i++) {
            list = _words[i].match(cleanRegExp);
            if (list != null)
                lists_total = lists_total.concat(list);
        }