Bashはreg式を1回以上チェックします。

Bashはreg式を1回以上チェックします。

変数「X」が次のパターンにあることを確認したいと思います[a-zA-Z0-9]+:[0-9]+:[0-9]+。次のコマンドで確認してください。if [[ "${X}" =~ [a-zA-Z0-9]+:[0-9]+:[0-9]+ ]]

ここで、パターンを複数に挿入するオプションを追加したいと思います。この場合,。私は同様のことができると思いました[a-zA-Z0-9]+:[0-9]+:[0-9]+[,[a-zA-Z0-9]+:[0-9]+:[0-9]+]*。私の質問は短くすることができますか?

ベストアンサー1

^[a-zA-Z0-9]+:[0-9]+:[0-9]+(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)*$セクションに角かっこの代わりに括弧を使用し、パターンを文字列の先頭と最後に固定する必要があります(,...)*(そうでない場合は、文字列の一部と一致するのに十分です)。

1つのオプションは、正規表現を維持しながら繰り返し部分を変数に格納することです。

p='[a-zA-Z0-9]+:[0-9]+:[0-9]+'
s='foo:12:34,bar:56:78'
[[ $s =~ ^$p(,$p)*$ ]] && echo yes

または、前にカンマを追加してください。、REを次に変更してください(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+

q='^(,[a-zA-Z0-9]+:[0-9]+:[0-9]+)+$'
[[ ,$s =~ $q ]] && echo yes

ただし、スクリプトのリストの値を処理する場合は、すぐにそれを複数の部分に分割する必要があるため、各部分を個別に分割してテストすることから始めることができます。

s='adsf,bar:56:78'
p='^[a-zA-Z0-9]+:[0-9]+:[0-9]+$'
IFS=, read -a a <<< "$s"
for x in "${a[@]}"; do 
    if [[ $x =~ $p ]]; then 
        echo "$x is ok";
    else 
        echo "$x is not ok"; 
    fi
done

おすすめ記事