正規表現は万能じゃない


正規表現をスパッと使えると格好いいけど、複雑な正規表現があるコードは引き継いだ人には結構厄介な仕事です。

時々、私が言っていることに「正規表現チューリング完全でないので全てを表現できる分けではないし、それを読む方の身になって考えてほしい」というのがあります。

#! /usr/bin/gawk -f

is_recomend($0 "") {
    print $0;
}

# is_recomend - recomended word? (see below)
#   http://code.nanigac.com/forum/view/249
function is_recomend(str) {
    if (str ~ /[-a-z0-9]/ && str !~ /--/ &&\
        length(str) >=3 && length(str) <= 20) {
        return str;
    } else {
        return 0;
    }
}

そのまま書いただけのコードですが、逆に説明の必要もないでしょう。
「ハイフンか小文字か数字で」「連続したハイフンは禁止で」「長さが 3 文字以上で」「20 文字以下」・・・まんまですが、それでいいと思います。
awk なので、'000' とかだと '0' になってしまうため、関数の引数の段階で文字列化しています。

ちなみに awk (gawk) であれば以下のような表現も使えます。

$ echo 'aiueo' | gawk --re-interval '/^[-a-z0-9]{3,20}$/'
aiueo