Bash regex: найти слово или его форму во множественном числе

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

Ответить

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