2015-10-21 2 views
2

У меня есть следующий код и вы можете посмотреть множество примеров, но не можете понять, что я делаю неправильно. Я знаю, что регулярное выражение работает (см. https://regex101.com/r/cB9hN1/1) - просто не в моем сценарии bash. Это для git update hook, но, очевидно, я делаю что-то неправильно! Вот что у меня есть:Bash Script Regular Expression Issue

regex='ref:(|)([D]|[U])([E]|[S])(\d+)'; 
string="My commit ref: US2233556" 

if [[ $string =~ $regex ]]; 
    then 
    echo "[SUCCESS] Your message contains ref: for a Story or Defect." 
    exit 0 
else 
    echo "[POLICY] Your message is not formatted correctly. Please include a \"ref: USXXXXX\" or \"ref: DEXXX\" in the commit message." 
    exit 1 
fi 

Буду признателен за любую помощь! Спасибо!

+1

Используйте 'regex = 'ref :(|) ([DU]) ([ES]) ([0-9] +)';'. –

ответ

1

Вы должны использовать [0-9] вместо \d и вы можете объединить чередовались классы символов в отдельные классы ([D]|[U] = [DU]):

regex='ref:(|)([DU])([ES])([0-9]+)'; 

См demo here

Если вы не используете группы захвата, просто удалите их:

regex='ref: ?[DU][ES][0-9]+'; 

Это another demo. Заметим, что (|) можно написать короче, как (?) или ()?, и таким образом это приведет к меньшему возврату назад.

+0

Серьезно, что \ d + была моей главной проблемой ?! –

+0

Да, это была главная проблема. Bash не поддерживает аромат PCRE regex, он намного хуже. –

+1

О, дорогая! Спасибо! Примите ответ, как только мне позволено! –