目前正在研究一些正则表达式来解析输入文件以获得正确的内容。我使用下面的正则表达式来解析一些输入:
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]