複数行の正規表現は機能しません。

複数行の正規表現は機能しません。

コミットメッセージが特定のスタイルガイドに準拠していることを確認するプロジェクト用のcommit-msgフックを作成しようとしています。gitしかし、正規表現の場合、別の方法で動作するものがあるようですbash。私の目標をどのように達成できますか?

#!/usr/bin/env bash

read -r -d '' pattern << EOM
(?x)                                      # Enable comments and whitespace insensitivity.
^                                         # Starting from the very beginning of the message
(feat|fix|docs|style|refactor|test|chore) # should be a type which might be one of the listed,
:[ ]                                      # the type should be followed by a colon and whitespace,
(.{1,50})\n                               # then goes a subject that is allowed to be 50 chars long at most,
(?:\n((?:.{0,80}\n)+))?                   # then after an empty line goes optional body each line of which
                                          # may not exceed 80 characters length.
$                                         # The body is considered everything until the end of the message.
EOM

message=$(cat "${1}")

if [[ ${message} =~ ${pattern} ]]; then
  exit 0
else
  error=$(tput setaf 1)
  normal=$(tput sgr0)
  echo "${error}The commit message does not accord with the style guide that is used on the project.${normal}"
  echo "For more details see https://udacity.github.io/git-styleguide/"
  exit 1
fi

私もこの正規表現を次のようにオンラインで書いてみました。

pattern="^(feat|fix|docs|style|refactor|test|chore):[ ](.{1,50})\n(?:\n((?:.{0,80}\n)+))?$"

\n交換しようとしましたが、$'\n'役に立ちませんでした。

ベストアンサー1

BashはPOSIX拡張正規表現(ERE)をサポートしますが、Perl互換正規表現(PCRE)はサポートしません。特に(?x)PCRE(?:...)です。

(?:...)に変更すると、1行のバージョンを簡単に確認できます(...)。 Perlx修飾子が提供する「空白を無視する」機能は、拡張正規表現では使用できません。

また見なさい:私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?

おすすめ記事