Как упростить регулярное выражение для проверки наличия «row)» или «rows)» в bash
При работе с регулярными выражениями в bash часто возникает задача проверить, соответствует ли некая переменная строке с определённым окончанием, например row)
или rows)
. Начинающие могут написать выражение с несколькими альтернативами, что приводит к избыточности и усложнению кода.
Проблема
Допустим, у нас есть переменная X
, которая содержит строку с информацией, включая фрагменты row)
или rows)
:
$ echo $X
(6 rows)
Чтобы проверить, заканчивается ли строка на row)
или rows)
, можно использовать условие в bash с регулярным выражением [[ $X =~ row\)$|rows\)$ ]]
. Такой подход работает, но дублирует часть шаблона, делая его менее удобным для чтения и поддержки.
Оптимизация регулярного выражения
Как упросить это выражение и сделать проверку короче?
В регулярных выражениях существуют квантификаторы, позволяющие указывать количество повторений символов. В частности, s?
означает «буква s
встречается 0 или 1 раз».
Используя этот прием, вместо варианта с двумя альтернативами, можно написать условие так:
[[ $X =~ rows?\)$ ]] && echo matches
Здесь часть rows?\)
означает, что после row
идёт либо символ s
(один раз), либо его нет вовсе, а затем скобка )
. Это решение короче, проще и не теряет в читаемости.
Объяснение работы выражения
row
— буквальный текст.s?
— символs
может быть либо присутствовать один раз, либо отсутствовать (0 раз).\)
— символ закрывающей круглой скобки, экранированный обратным слэшем, так как в регулярках скобки имеют спецзначение.$
— конец строки, то есть мы проверяем, что указанная последовательность находится в конце.
Таким образом, регулярное выражение удачно покрывает оба варианта — row)
и rows)
.
Резюме и рекомендации
Для проверки окончания строки на «row)» или «rows)» в bash удобнее использовать квантификатор ?
вместо перечисления через альтернативы. Это улучшает читаемость и облегчает поддержку кода.
Итоговый шаблон:
[[ $X =~ rows?\)$ ]] && echo matches
Будьте внимательны с экранированием специальных символов, например, круглой скобки )
, которая требует обратного слэша.
Такой подход приёмлем для большинства простых сценариев проверки строк в bash с поддержкой регулярных выражений.