5

文字列がアルファベット文字のみで構成されていることを検証しようとすると、2 つの正規表現ソリューションが思い浮かびます。

最初のものは、文字列内のすべての文字が英数字であることを確認します。

/^[a-z]+$/

2 つ目は、英数字以外の文字列のどこかにある文字を見つけようとします。

/[^a-z]/

(はい、ここで文字クラスを使用できます。)

長い文字列のパフォーマンスに大きな違いはありますか? (どちらかといえば、2番目のバリアントの方が速いと思います。)

4

2 に答える 2

4

それを見るだけで、2番目の方法の方が速いと思います。

しかし、私は簡単な非科学的テストを行いましたが、結果は決定的ではないようです:

正規表現の一致と否定


PS最初の方法からグループ キャプチャを削除しました。それは余分であり、それを遅くするだけです。

于 2012-09-05T18:31:50.523 に答える
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"
                    }
            }
    }

次に、次のように実行しました。<perl_file>; 日にち

100% 科学的ではありませんが、良いアイデアが得られます。最初の Regex の実行には 10 秒または 11 秒かかり、2 番目の Regex の実行には 8 秒かかりました。

于 2012-09-05T19:00:25.007 に答える