ゼロ個以上のカンマ区切りキーワードと一致

ゼロ個以上のカンマ区切りキーワードと一致

カンマ区切りの0個以上のキーワードと一致する可能性が欲しいです。

私は次の正規表現を使用します

if [[ "$var" =~ ^([^,]+(,[^,]+)*)*$ ]]; then
  echo "KY MATCH"
fi

次のようにマッチしたい

var=""
var="keyword"
var="keyword,keyword"
var="keyword,keyword,keyword"

正規表現を単純化したり、明確にしたりできますか?

答え1

Bash は POSIX 拡張正規表現を使用します。 tryinfo bash -n 'Conditional Constructs'man 7 regex(最初のコマンドの場合はインストールする必要がありinfo、2番目のコマンドの場合man-pages)。

キーワードに文字のみが含まれている場合は、文字クラスを使用するか、またはを[:alpha:]使用できます。[:alnum:][:word:]

このスクリプトを試して、正しいクラスを選択してください。


#!/bin/bash

for var in "" "keyword" "keyword,keyword" "keyword,keyword,keyword"; do
    [[ "$var" =~ ^([[:alpha:]]+,?)*$ ]] && echo "$var" MATCHES || echo "$var" DOES NOT MATCH
done

for var in "1" "key word" "key123word,keyword" "keyword, keyword ,keyword"; do
    [[ "$var" =~ ^([[:alpha:]]+,?)*$ ]] && echo "$var" MATCHES || echo "$var" DOES NOT MATCH
done

修正する

コメントで述べたように、私の表現はここには適用されません - keyword,keyword,。この表現が適切なようです^([[:alpha:]]+(,[[:alpha:]]+)*)*$。どのように簡単にすることができるのか分からない。

答え2

コンマ区切りのキーワードを次のように正規表現に変換すると、簡単になります。

#!/usr/bin/env -S bash - 

#keywords="keyword"
#keywords="aaa,bbb,ccc"
keywords="aaa,bbb,ccc,"
#keywords="ddd,"
#keywords=""

var='aaa'
regex="${keywords%,}"   # trim trailing ','
regex="${regex//,/\|}"  # replace ',' with '|'

printf 'Your var  : %s\n' "$var"
printf 'Your regex: %s\n' "$regex"

if [[ $var =~ ^($regex)$ ]]; then
    printf '%s\n' '-> it matches'
else
    printf '%s\n' '-> it does not match'
fi

これにより

$ temp/match-comma-separated-keywords.sh
Your var: aaa
Your regex: aaa|bbb|ccc
-> it matches

答え3

除外する唯一の項目は、,フィールドがない特殊な場合を除いて、nullで区切られたフィールドのようです。したがって、,最初または最後、または2つの連続した文字列を持つ文字列を除外します。

case $string in
  (,* | *,,* | *,) echo>&2 not OK;;
  (*) echo OK;;
esac

または

case ,${string:-empty}, in
  (*,,*) echo>&2 not OK;;
  (*) echo OK;;
esac

これは標準のPOSIX sh構文、またはKornスタイルの構文を使用します。

[[ ,${string:-empty}, != *,,* ]]。不要=~

正規表現は次のとおりです。

[[ $string, =~ ^([^,]+,)*$ ]]

ただし、ワイルドカードパターンを使用すると、システムの正規表現エンジンやそれに伴う問題(非文字による窒息など)に頼らずにこれを行うことができます。

[[ $string, = *(+([^,]),) ]]

関連情報