Grep / bash正则表达式-交替和数字集的组合

时间:2019-03-26 11:00:55

标签: regex bash grep githooks

我需要最终匹配以下任何一项: AD-123, ad-123, AD123, and ad123

到目前为止,我拥有的是

| grep -oP 'AD-|ad-|AD|ad'[0-9]\+)

但这仅匹配字母并且完全忽略数字,我无法找出一种友好的方式来实现此目的。

上下文/用例:prepare-commit-msg githook,我想从分支名称中提取Jira票证并将其添加到任何提交消息中。可以使用功能/版本/股票代码关键字的分支命名约定(例如feature / 1.1.3 / ad-123-some-branch)

2 个答案:

答案 0 :(得分:2)

您可以使用

| grep -oE "(AD|ad)[-']?[0-9]+"

这是一个与POSIX ERE(由于-E选项相匹配)的正则表达式

  • (AD|ad)-ADad(不是aDAd,因为您的要求不允许这样做)
  • [-']?-可选的-'
  • [0-9]+-1个或更多数字

可视化:

enter image description here

答案 1 :(得分:0)

[[运算符(扩展测试)功能强大,足以进行此匹配,而无需使用任何第三方工具进行匹配。只需使用shopt为不区分大小写的匹配启用一个选项,然后执行

shopt -s nocasematch
for word in AD-123 ad-123 AD123 ad123; do 
    if [[ $word == +(a|d)?(-)+([0-9]) ]]; then
        echo "$word"
    fi
done

默认情况下,在==内使用[[会使用bash模式匹配中的extglob option。如果您不想设置忽略大小写选项,请

[[ $word == +([Aa]|[Dd])?(-)+([0-9]) ]]