2013-06-10 3 views
22

Hello awesome community,Регулярное выражение в скрипте Bash

Я полный наркотик, когда дело доходит до регулярного выражения. Я отвлекся от изучения этого ... и теперь моя лень догнала меня.

То, что я пытаюсь сделать:
Проверьте, если строка соответствует формат:

10_06_13 

т.е.. дата сегодняшними или подобная дата с «2digits_2digits_2digits»

Что я сделал:

regex='([0-9][0-9][_][0-9][0-9][_][0-9][0-9])' 
if [[ "$incoming_string" =~ $regex ]] 
then 
    # Do awesome stuff here 
fi 

Это работает в определенной степени. Но когда входящая строка равна 011_100_131 ... она все еще проходит проверку регулярного выражения.

Буду благодарен, если кто-нибудь может помочь мне указать направление в правильном направлении.
Приветствия

+1

Обратите внимание, что подчеркивания не обязательно должны находиться в квадратных скобках. '_' совпадает с' [_] '. – chepner

+2

011_100_131 не соответствует вашему регулярному выражению. 011_10_131. – hop

ответ

35

=~ успешно, если строка слева содержит совпадение для регулярного выражения справа. Если вы хотите знать, если строка соответствует регулярное выражение, вы должны «якорь» регулярное выражение с обеих сторон, как это:

regex='^[0-9][0-9][_][0-9][0-9][_][0-9][0-9]$' 
if [[ $incoming_string =~ $regex ]] 
then 
    # Do awesome stuff here 
fi 

^ преуспевает только в начале строки, и $ преуспевает только в конце.

Примечания:

  1. я удалил ненужные () из регулярного выражения и "" от [[ ... ]].
  2. Руководство пользователя bash плохо написано, поскольку в нем указано, что =~ успешно выполняется, если строка соответствует.
+0

Черт, я был так близко! Я предполагал, что «^» должен был исключать символы. Большое спасибо! :) – Robbie

+7

@Robbie: '^' означает «исключение», когда это первое в наборе символов ('[...]'), и это означает «привязано», когда оно является первым в шаблоне. В противном случае он просто соответствует '^' (но это не так во всех реализациях регулярных выражений, иногда это означает «соответствие началу строки»). Я согласен, что это сбивает с толку, пока вы не привыкнете к этому. – rici

+0

Отлично! Очень полезно, спасибо снова. Заслуженно проголосовали! – Robbie

Смежные вопросы