Bash: точне відповідність рядка з регулярним виразом


6

Я повинен точно збігатись у рядку з регулярним виразом. я повинен усвідомити цю закономірність: toCheck повинен починатися з 2 виникнення $ str1, з максимумом 1 виникнення $ str2. Якщо toCheck відповідає шаблону, я повинен написати $ toCheck: успіх у виводі, $ toCheck: не вдалося інакше.

Я написав цей регулярний вираз:

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

Використовуючи сайт regexr.com, я вставив, наприклад:

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

Це успіх.

На regerx.com цей матч до останнього ба:

toCheck="lolobaba"

але, на мій баш-код, це успіх.

Це повний код:

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

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

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

Отже, питання: як мати точну відповідність між рядком і регулярним виразом?


1
FYI: Це збіг на regex101.com
duDE,

1
Ваше запитання заплутане: ви можете мати точну відповідність (рядки однакові), або ви можете відповідати повторним вираженням (рядок відповідає шаблону в регулярному виразі). Рядок відповідає або звичайному виразу, або він не відповідає - приблизного збігу немає.
AFH

Відповіді:


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.