正则表达式性能:验证字母数字字符

时间:2012-09-05 18:24:44

标签: regex performance

当尝试验证字符串仅由字母字符组成时,我想到了两种可能的正则表达式解决方案。

第一个检查字符串中的每个字符是否为字母数字:

/^[a-z]+$/

第二个尝试在字符串中找到字母数字的某个字符:

/[^a-z]/

(是的,我可以在这里使用字符类。)

长字符串是否有明显的性能差异? (如果有的话,我猜第二个变种更快。)

2 个答案:

答案 0 :(得分:4)

只要看一下,我就说第二种方法更快。

然而,我做了一个快速的非科学测试,结果似乎没有结果:

<强> Regex Match vs. Negation


P.S。我从第一种方法中移除了群组捕获。它是多余的,只会减慢速度。

答案 1 :(得分:2)

写了这个快速的Perl代码:

    @testStrings = qw(asdfasdf asdf as aa asdf as8up98;n;kjh8y  puh89uasdf ;lkjoij44lj 'aks;nasf na ;aoij08u4 43[40tj340ij3 ;salkjaf;  a;lkjaf0d8fua ;alsf;alkj   
a a;lkf;alkfa as;ldnfa;ofn08h[ijo ok;ln n ;lasdfa9j34otj3;oijt 04j3ojr3;o4j ;oijr;o3n4f;o23n a;jfo;ie;o ;oaijfoia ;aosijf;oaij ;oijf;oiwj; 
qoeij;qwj;ofqjf08jf0 ;jfqo;j;3oj4;oijt3ojtq;o4ijq;onnq;ou4f ;ojfoqn;aonfaoneo ;oef;oiaj;j a;oefij iiiii iiiiiiiii iiiiiiiiiii); 


    print "test 1: \n";
    foreach my $i (1..1000000) {
            foreach (@testStrings) {
                    if ($_ =~ /^([a-z])+$/) {
                            #print "match"
                    } else {
                            #print "not"
                    }
            }
    }

    print `date` . "\n";

    print "test 2: \n";
    foreach my $j (1..1000000) {
            foreach (@testStrings) {
                    if ($_ =~ /[^a-z]/) {
                            #print "match"
                    } else {
                            #print "not"
                    }
            }
    }

然后运行它: 日期; &LT; perl_file取代;日期

它不是100%科学,但它给了我们一个好主意。第一个正则表达式花了10或11秒执行,第二个正则表达式需要8秒。