正規表現の練習

MOONGIFT: » Windowsでの正規表現の練習に「正規表現練習ツール」:オープンソースを毎日紹介 を見て,正規表現でマッチする部分を示してくれるものを作ってみました。

具体的には、shell のエスケープシーケンスを用いて色を付けています。

基本的には正規表現は『最長一致』ですが、関数を再帰的に呼ぶことで、先頭からマッチする全ての部分に色を付けるようにしています。

#! /usr/local/bin/nawk -f
# search_regexp.awk
# 正規表現にマッチする部分を探す
# usage: nawk -v regexp=regexp -f search_regexp.awk foo.txt

{
    color_regexp(regexp, $0);
}

function color_regexp(reg, str) {
    if (match(str, reg)) {
        printf("%s\033[32m%s\033[0m",
                substr(str, 1, RSTART - 1),
                substr(str, RSTART, RLENGTH));
        color_regexp(reg, substr(str, RSTART + RLENGTH));
    } else {
        print str;
    }
}

意外にも短く記述することができました。

具体的には以下のようにして実行すると正規表現一致部分が緑色で表示されます。

$ nawk -v regexp='regexp' -f search_regexp.awk search_regexp.awk
#! /usr/local/bin/nawk -f
# search_regexp.awk
# 正規表現にマッチする部分を探す
# usage: nawk -v regexp=regexp -f search_regexp.awk foo.txt

{
    color_regexp(regexp, $0);
}

function color_regexp(reg, str) {
    if (match(str, reg)) {
        printf("%s\033[32m%s\033[0m",
                substr(str, 1, RSTART - 1),
                substr(str, RSTART, RLENGTH));
        color_regexp(reg, substr(str, RSTART + RLENGTH));
    } else {
        print str;
    }
}

実際には色が付いているんですが・・・ここで表示する術がないので、皆さんご自分で試してみてください。

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