6

Я должен сделать точное совпадение строки с регулярным выражением. я должен понять этот шаблон: toCheck должен начинаться с 2 вхождений $ str1, с максимальным 1 вхождением $ str2. Если toCheck соответствует шаблону, я должен написать $ toCheck: success внутри вывода, $ toCheck: fail в противном случае.

Я написал это регулярное выражение:

regex="$1($1)+$2"

Используя сайт regexr.com, я вставил, например:

regex="lo(lo)ba"
toCheck="loloba"

Это успех.

На regerx.com этот матч до последнего ба:

toCheck="lolobaba"

но, по моему bash-коду, это успех.

Это полный код:

toCheck="lolobaba"
regex="lo(lo)+ba"

if [[ $toCheck =~ $regex ]]; then

    echo "$toCheck:success" > output
else
    echo "$toCheck:failed" > output
fi

Итак, вопрос: как получить точное соответствие между строкой и регулярным выражением?

2 ответа2

7

Вы получаете успех, потому что регулярное выражение совпадает на его части .

Если вы хотите точное совпадение, вам нужно привязать шаблон к началу и концу строки: regex="^lo(lo)+ba$"

  • ^ обозначает начало строки: перед шаблоном не может быть ничего
  • $ обозначает конец строки: после ничего не может быть

В исходном коде, поскольку шаблон не привязан, сопоставление с шаблоном не заботится о том, что может быть до или после, если хотя бы часть строки проверяет шаблон.

1

Для чего нужны скобки? должен начинаться с 2x $ str1 и заканчиваться максимум 1x $ str2

Так что это

    if [[ $toCheck =~ ^$str1$str1($str2|)$ ]] ; then
        echo "$toCheck:success" > output
    else
        echo "$toCheck:failed" > output
    fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .