Bash
RegExp - Bash 中的可選擷取組?
目前正在研究一些正則表達式來解析輸入文件以獲得正確的內容。我正在使用下面的 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]
輸入它應該匹配:
cell-80-sandp-sit-a
或者匹配這個:
cell-80-sandp-a
輸入的
-sit
部分應該是一個可選的擷取組,據我了解,這意味著如果沒有找到這個擷取組,RegExp 將成功繼續,或者如果找到它也成功完成。對於這種情況,我將在 if 語句中使用它:
if [[ "$Input" =~ $RegExp ]]; then #stuff fi
誰能指出上面有什麼問題?我一直在用
regex101.com
它來測試它。
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