3

ユーザー名を検証するためにこれを行っています:

if [[ "$username" =~ ^[a-z][_a-z0-9]{2,17}$ ]]; then

しかし実際には、é、ç、à などの Unicode 文字を含むユーザー名は受け入れられます。文字列を ASCII 文字 (a、b、c、d ... z) のみに制限するには、どの正規表現クラスを使用すればよいですか?

4

4 に答える 4

3

最初の設定でこれを行うことができるはずですLC_ALL=C(おそらく、他に影響を与えないように一時的に)。より最新の正規表現エンジンでは、アクセント付き文字を基本文字に折りたたむことができるロケールを使用できます (または、少なくとも と の間に来るように順序付けますa) z

C ロケールは ASCII しか認識しないため、これで問題が解決するはずです。

たとえば、次のスクリプトを参照してください。

#!/bin/bash

username=amélie_314159

for locale in '' 'C' ; do
    export LC_ALL="${locale}"
    printf "LC_ALL set to %-3s: '%s' is " "'$LC_ALL'" "${username}"
    if [[ "${username}" =~ ^[a-z][_a-z0-9]{2,17}$ ]] ; then
        echo valid
    else
        echo invalid
    fi
done

出力:

LC_ALL set to '' : 'amélie_314159' is valid
LC_ALL set to 'C': 'amélie_314159' is invalid
于 2013-05-24T09:22:21.687 に答える
3

防弾の方法は、単に次の[a-z]ように綴ること[abcdefghijklmnopqrstuvwxyz]です。そこには!1970 年 1 月 1 日 00:00:00 以降、ロケールやおかしな文字クラスをいじらず、どのシェルでもサポートされています。OS ベンダー、シェル ベンダー、Unix 標準化プロセス、または BOFH がクールだと考えているものに関係なく、将来性があります。

lc次のような追加の変数を使用して

lc=abcdefghijklmnopqrstuvwxyz

正規表現も読み取り可能になります。

[$lc][_0-9$lc]{2,17}

これは、非常に堅牢で移植可能なconfigureスクリプトが行うことです。

于 2013-05-24T11:50:59.427 に答える