
カンマ区切りの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, = *(+([^,]),) ]]