Как упростить регулярное выражение для проверки наличия «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 с поддержкой регулярных выражений.



