RegExp - Bash 中的可选捕获组?

64H*_*4Hz 2 bash text-processing regular-expression test

目前正在研究一些 RegExp 来解析输入文件以获得正确的内容。我正在使用下面的 RegExp 来解析一些输入:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(?:-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))-[a-z]
Run Code Online (Sandbox Code Playgroud)

输入它应该匹配:

cell-80-sandp-sit-a
Run Code Online (Sandbox Code Playgroud)

或者匹配这个:

cell-80-sandp-a
Run Code Online (Sandbox Code Playgroud)

-sit输入的部分应该是一个可选的捕获组,据我所知,这意味着如果没有找到这个捕获组,RegExp 将继续成功,或者如果找到它也会成功完成。

对于这种情况,我将在 if 语句中使用它:

if [[ "$Input" =~ $RegExp ]];
    then
        #stuff
fi
Run Code Online (Sandbox Code Playgroud)

谁能指出以上有什么问题?我一直在regex101.com用来测试它。

Kus*_*nda 8

bash 理解标准的扩展正则表达式(“ERE”),而不是 PCRE(“Perl 兼容的正则表达式”)。

您的 PCRE:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(?:-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))-[a-z]
Run Code Online (Sandbox Code Playgroud)

所述(?:...)在一个PCRE是非捕获组(未可选基团)。ERE 中没有等价物,所有组都在捕获。

要使表达式可选,您可以使用 限定它?,就像我在下面所做的那样。这?意味着前一个表达式应该匹配一次或零次。

作为 ERE:

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)?-[a-z]
Run Code Online (Sandbox Code Playgroud)

或者,收缩(SIT[a-z]|SIT[1-9])SIT[a-z1-9]

cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD))?-[a-z]
Run Code Online (Sandbox Code Playgroud)

您可能还想为此添加锚定:

^cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD))?-[a-z]$
Run Code Online (Sandbox Code Playgroud)

...否则它会匹配 somethingcell-...-ablahblah