正規表現記述の順序

404 Blog Not Found:RegExp - /dan|dankogai/ != /dankogai|dan/ によると多くの言語では /(dan|dankogai)/ と /(dankogai|dan)/ とが異なっているということなので、awk で調べてみました。

awk の match() 関数はマッチした部分を RSTART (マッチ開始), RLENGTH (マッチした長さ) という変数として格納しますので、以下のようなスクリプトを用意します。

#! /usr/local/bin/nawk -f
# regexp.awk

BEGIN {
    str = "dankogai";

    match(str, /(dan|dankogai)/);
    print substr(str, RSTART, RLENGTH);

    match(str, /(dankogai|dan)/);
    print substr(str, RSTART, RLENGTH);
}

実行してみましょう。

$ nawk -f regexp.awk
dankogai
dankogai

どちらも dankogai としてマッチしていることが分かります。

gawk では match() 関数に 3 番目の引数を取れ、ここにマッチした順に配列として格納されます。

#! /usr/local/bin/gawk -f
# regexp_gawk.awk

BEGIN {
    str = "dankogai";

    match(str, /(dan|dankogai)/, arr);
    print substr(str, RSTART, RLENGTH);
    print arr[1];

    match(str, /(dankogai|dan)/, arr);
    print substr(str, RSTART, RLENGTH);
    print arr[1];
}

ちょうど Perl や JavaScript の $1 に値します。

では、実行してみます。

$ gawk -f regexp_gawk.awk
dankogai
dankogai
dankogai
dankogai

やはりちゃんと dankogai にマッチしていることが分かります。

正規表現はそれぞれの言語によって振る舞いが異なることがあるので、使用する言語に合わせて考える必要がありそうです。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png