RegExp - Bash 中可选的捕获组?

RegExp - Bash 中可选的捕获组?

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

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]

输入它应该匹配:

cell-80-sandp-sit-a

或者匹配这个:

cell-80-sandp-a

-sit输入的部分应该是选修的捕获组,据我了解,这意味着如果 RegExp 找不到此捕获组,它将成功继续,或者如果找到它,也将成功完成。

对于本例,我将在 if 语句中使用它:

if [[ "$Input" =~ $RegExp ]];
    then
        #stuff
fi

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

答案1

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]

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]

或者,(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]

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

^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]$

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

答案2

(?:...)不是一个可选的捕获组,而是一个非捕获组,据我所知,bash 甚至不支持它。这应该有效:

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]

相关内容