2016-11-02 7 views
0

Я пытаюсь использовать Regex в Баш, чтобы проверить, если параметр, кажется, правильный путь после этого формата:Bash, если заявление с регулярным выражением

/first/second 

В Java я с успехом использовать следующий Regex:

((\\/)[a-zA-Z0-9\\[email protected]\\-!#$%&+=]+)+ 

Но в bash у меня есть проблема, которую я не могу объяснить. Чтобы упростить мое понимание я стараюсь использовать более простой Regex так:

CHECKPATH="!/first/second" 
REGEX_PATH="((\/)[a-zA-Z0-9]+)+" 
if [[ ! ${CHECKPATH} =~ $REGEX_PATH ]]; then 
    echo "error" 
else 
    echo "OK" 
fi 

Я вставить «!» на пути, чтобы проверить. Поэтому у меня должна быть «ошибка», но нет. С или без "!" он ничего не меняет, в чем проблема?

Update: (подвопрос Перенесено автора здесь из комментария)

Еще одна вещь, если я использую ^((\/)[a-zA-Z0-9\[email protected]#&%!$+=\-]+)+$ это нормально, но это не с ^((\/)[a-zA-Z0-9\[email protected]\-#&%!$+=]+)+$. Я просто изменил положение «\ -» внутри регулярного выражения, почему?

+1

Возможно, вам потребуется добавить^и $ для начала и окончания. попробуйте протестировать его здесь: http://www.regexpal.com/ – Buzz

+0

Работает для меня в 'bash' 3.2 и 4.3, с или с символом'! 'в значении' CHECKPATH'. – chepner

ответ

2

Некоторые библиотеки регулярных выражений (возможно, Java, которые вы используете) имеют методы, которые специально проверяют регулярное выражение на всю строку ввода.

Но в Баш (и, как правило, в регулярных выражениях) вы используете:

  • ^ - начала матч ввода и
  • $ - соответствует конец ввода

Так вместо того, чтобы попытаться ,

REGEX_PATH="^((\/)[a-zA-Z0-9]+)+$" 

Обновление:

Вы должны поместить черту в начало/конец.

http://man7.org/linux/man-pages/man7/regex.7.html:

Чтобы включить литерал «-», делают это первый или последний символ, или второй конечной точкой диапазона. Чтобы использовать литерал '-' в качестве первой конечной точки диапазона, заключите его в "[." и ".]", чтобы сделать его элементом сравнения (см. ниже).

И (такой же ссылка) [курсив мой]

За исключением этих и некоторых комбинаций с помощью '[' (см следующие пункты), все другие специальные символы, включая '\', теряют свое особое значение в выражении скобки.

+0

ОК спасибо,^и $ решили мою проблему! – gduh

+0

Еще одна вещь, если я использую^((\ /) [a-zA-Z0-9 \ s _ @ # &%! $ + = \ -] +) + $, это нормально, но это не с^((\ /) [A-Za-Z0-9 \ s _ @ \ - # &% $ + =] +) + $.Я просто изменяю положение «\ -» внутри регулярного выражения, почему? – gduh

+0

@gduh Я переместил это подзапрос на исходный вопрос и добавил обновление к моему ответу. –

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