Bash

RegExp - Bash 中的可選擷取組?

  • May 17, 2018

目前正在研究一些正則表達式來解析輸入文件以獲得正確的內容。我正在使用下面的 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

引用自:https://unix.stackexchange.com/questions/444366