{ } — совпадение с элементом определенное число раз
Метасимволы { и } используются, чтобы выразить минимальное и максимальное число обязательных совпадений. Эти числа можно представить четырьмя возможными способами, как показано в табл. 19.3.
Таблица 19.3. Определение числа совпадений
Спецификатор
Значение
{n}
Предыдущий элемент соответствует, если встречается точно n раз
{n,m}
Предыдущий элемент соответствует, если встречается не менее n и не более m раз
{n,}
Предыдущий элемент соответствует, если встречается n или более раз
{,m}
Предыдущий элемент соответствует, если встречается не более m раз
Возвращаясь к примеру с телефонными номерами, мы воспользуемся этим методом определения повторений, чтобы упростить исходное регулярное выражение
^(?[0-9][0-9][0-9])? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
до
^(?[0-9]{3})? [0-9]{3}-[0-9]{4}$
Опробуем его:
[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^(?[0-9]{3})? [0-9]{3}-
[0-9]{4}$'
(555) 123-4567
[me@linuxbox ~]$ echo "555 123-4567" | grep -E '^(?[0-9]{3})? [0-9]{3}-[0-9]{4}$'
555 123-4567
[me@linuxbox ~]$ echo "5555 123-4567" | grep -E '^(?[0-9]{3})? [0-9]{3}-
[0-9]{4}$'
[me@linuxbox ~]$
Как видите, измененная версия регулярного выражения успешно справляется с проверкой номеров, с круглыми скобками и без них, и отвергает неправильно оформленные номера.