Почему bash if = ~ regex отрицает символ, не работает - PullRequest
0 голосов
/ 07 мая 2020
test="blah*blah"
if ! [[ ${test} =~ [\*] ]] ; then echo ok; else echo failed; fi

=> не удалось

test="blah/blah"
if ! [[ ${test} =~ [\*] ]] ; then echo ok; else echo failed; fi

=> ОК

test="blah/blah"
if [[ ${test} =~ [^\*] ]] ; then echo ok; else echo failed; fi

=> ОК

test="blah*blah"
if [[ ${test} =~ [^\*] ]] ; then echo ok; else echo failed; fi

=> ОК ??? ПОЧЕМУ?

В чем секрет использования отрицательного шаблона для символа где-нибудь в строке?

1 Ответ

1 голос
/ 07 мая 2020

Ваше регулярное выражение (не нужно экранировать * внутри выражения в квадратных скобках)

[^*]

соответствует любому одиночному символу, который является не an *. Поскольку регулярные выражения не привязываются неявно, до тех пор, пока любой символ в строке не является *, совпадение будет успешным. Якорение

^[^*]$

соответствует точно тем односимвольным строкам, которые не являются *. Он не будет соответствовать более длинной строке.

Если вы добавите * после него, вы получите регулярное выражение, которое соответствует 0 или дополнительным последовательным символам, которые не являются *. Якорение дает вам регулярное выражение, которое соответствует любой строке (включая пустую строку), которая состоит только из символов, отличных от *.

^[^*]*$

Если вы хотите сопоставить только непустые строки, убедитесь, что строка начинается с символа, отличного от *, затем проверьте, что остальные (если есть) также не *.

^[^*][^*]*$

Это можно сократить, используя + вместо * для повторения. (* соответствует 0 или более; + соответствует 1 или более.)

^[^*]+$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...