bash
正規表現メッセージを解析し、グループをキャプチャするためのいくつかのタスクを実行する素晴らしい小さなスクリプトがあります。
regex='\((Closes|Resolves):\s([0-9]+)\)'
msg='Fixed a problem (Closes: 1234), (Resolves: 5678)'
if [[ $msg =~ $regex ]] ; then
action="${BASH_REMATCH[1]}"
issue="${BASH_REMATCH[2]}"
do_something $action $issue
fi
これは、最初の一致に適していますが、一致する項目が複数ある場合、後続のmsg
一致は無視されます。各ゲームを循環する方法はありますか?それとも今考え始める時間python
ですかperl
?
ベストアンサー1
組み込みbash
構文では明示的にサポートされていませんが、いくつかの変数置換といくつかの再帰によって簡単に実装できます。
function do_something {
echo $1 $2
}
function handlematches {
regex='\((Closes|Resolves):\s([0-9]+)\)'
msg=$1
if [[ $msg =~ $regex ]] ; then
action="${BASH_REMATCH[1]}"
issue="${BASH_REMATCH[2]}"
do_something "$action" "$issue"
# Remove the first regex match and try again
handlematches "${msg/${BASH_REMATCH[0]}/}"
fi
}
message='Fixed a problem (Closes: 1234), (Resolves: 5678)'
handlematches "$message"
出力:
Closes 1234
Resolves 5678