RegExp - Bashのオプションのキャプチャグループ?

RegExp - Bashのオプションのキャプチャグループ?

現在、正しいコンテンツを取得するために入力ファイルを解析するいくつかの正規表現に取り組んでいます。いくつかの入力を解析するには、次の正規表現を使用しています。

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(?:-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))-[a-z]

以下と一致する必要があります。

cell-80-sandp-sit-a

またはこれを一致させなさい:

cell-80-sandp-a

-sit入力部分は次のようにする必要があります。任意に選択できる私が理解しているように、グループキャプチャは、RegExpがこのキャプチャグループを見つけることができない場合は正常に続行するか、グループを見つけると正常に完了することを意味します。

この例では、ifステートメントでこれを使用します。

if [[ "$Input" =~ $RegExp ]];
    then
        #stuff
fi

誰も上記の問題を指摘できますか?テスト用に使ってみましたregex101.com

ベストアンサー1

bashPCRE(「Perl互換正規表現」)ではなく、標準拡張正規表現(「ERE」)を理解してください。

あなたのPCRE:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(?:-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))-[a-z]

PCRE(?:...)は非キャプチャグループ(選択グループではありません)です。 EREには同等のものはなく、すべてのグループがキャプチャしています。

式をオプションにするには、次の?ように式を修飾できます。これは?、前の式が1回または0回一致する必要があることを意味します。

EREで:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)?-[a-z]

または(SIT[a-z]|SIT[1-9])契約を結んでSIT[a-z1-9]

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD))?-[a-z]

ここにアンカーを追加することもできます。

^cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD))?-[a-z]$

...そうでなければ一致しますsomethingcell-...-ablahblah

おすすめ記事