【问题标题】:Why do git commit-msg on Windows not match regex为什么 Windows 上的 git commit-msg 与正则表达式不匹配
【发布时间】:2019-05-18 03:45:10
【问题描述】:

我正在尝试创建一个 git commit-msg 挂钩,其中包括一个简单的正则表达式来验证日志消息。它不能使用通常的 bash 语法。

我用一个非常简单的正则表达式试了一下,还是不行

知道我做错了什么吗?

这是一个包含明显匹配的简单示例,但它打印出“不匹配”

#!/bin/bash
message="[GLSD-0000]"
echo "Message: '$message'"
regex="\[GLSD-\w+\]"
if [[ $message =~ $regex ]]; then echo "yes";else echo "no match!"; fi

使用 git 版本 2.18.0.windows.1

【问题讨论】:

  • Bash 通常不支持像 \w 这样的 Perl 风格的通用字符类型。改为阅读POSIX extended regular expressions(或咨询man re_format,如果您的本地计算机上可用)。

标签: regex bash shell git-bash


【解决方案1】:

您尝试做的一些注意事项,

  1. 您的解释器确实#!/bin/sh 不支持bash 中的正则表达式操作,即使您没有使用它。你应该再次使用 bourne shell bash (#!/usr/bin/env bash).
  2. [[..]]= 对左侧操作数与右侧操作数进行字符串匹配。对于正则表达式支持,您需要使用~ 运算符
  3. bash 仅支持 ERE(扩展正则表达式)的最小版本,其中不支持 \w(所有单词)。

因此,在针对bash shell 的脚本中,您应该将其编写为

#!/usr/bin/env bash

# equivalent of '\w' in the regex flavor supported by bash
re='\[GLSD-[A-Za-z0-9_]+\]'
msg='[GLSD-0000]'
[[ $msg =~ $re ]] && echo "yes" || echo "no match!"

【讨论】:

  • 另外,/bin/sh 不支持 [[ ]] 开头。
  • 不应该1 可能是$11 始终是字母数字,测试没有意义。
  • 谢谢@BenjaminW。 .我会让 OP 随意使用它。
  • 抱歉出现一些转录错误。请看更正
  • @VictorGrazi:已更新以匹配您的示例
猜你喜欢
  • 2021-09-29
  • 2022-01-04
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
相关资源
最近更新 更多