テスト否定正規表現の使用方法

テスト否定正規表現の使用方法

これは構文上正しくありません。

#!/usr/bin/env bash

dimension="4x5"

if [[ "$dimension" !=~ '[0-9]x[0-9]' ]]; then
 echo 'wtf meng, the dimension needs an "x" in it.'
 return 1;
fi

上記の構文はひどいです...だから私の質問は - それを行う方法はありますか?!=~

...そうだと思いますか!~?これが真であれば、否定規則lulzについてはこれだけです。はい、テストしてみましたがうまく!~いきませんでした...

ベストアンサー1

キーワードには!=~or!~演算子はありません[[。代わりに比較を無効にしてください。

[[ ! "string" =~ regex ]]

引用regexの主張に関して、マニュアルには次のように記載されています。

パターンのすべての部分を引用して、引用された部分を文字列に一致させることができます。

regexcompat31したがって、シェルオプションが設定されていない限り、正規表現部分を引用しないでください。

shopt...compat31

設定されている場合、bashはバージョン3.1の条件付き[[コマンド演算子=~の引用符付き引数の動作に変更されます。

与えられた例では、以下を試してみてください。

if [[ ! "$dimension" =~ ^[0123456789]+x[0123456789]+$ ]]; then
    printf '%s %s\n' "'$dimension'" 'is not a valid dimension.'
fi
  • regex固定する必要があり^...$、そうでなければfoo1x1fubar有効な測定基準と見なされます。

また、入力検証などの範囲を使用しないでください0-9。特に、セキュリティに敏感なコンテキストから削除する場合、多くのロケールでは、これらの範囲に歴史的(または複数の文字で構成される組み合わせ要素)よりも多くの文字が含まれています(Cではまだそうです)。 /POSIX ロケール)。

なぜなら=~ここには助けがbashないからですglobasciiranges。 Ubuntu 19.10およびen_GB.UTF-8ロケールでは0123456789に加えてbash。少なくとも私の場合、すべて0から8までの10進数とは何の関係もありますが、通常これは保証されません。[0-9]globasciiranges

一方、これらは10個のみ[[:digit:]]一致し、[0123456789]すべてのPOSIX互換システムで動作する必要があります。

sh標準構文とワイルドカードパターンを使用してこれを行うこともできます。たとえば、次のようになります。

valid_geometry() case $1 in
  (*[!x0123456789]* | *x | x* | *x*x*) false;;
  (*x*) true;;
  (*) false;;
esac
if ! valid_geometry "$dimension"; then
   ...
fi

または、ksh globを使用してください( でサポートされていなくてもbash -O extglobサポートされていますbash)。[[extglob

if [[ $dimension != +([0123456789])x+([0123456789]) ]]; then
  ...
fi

おすすめ記事