Квантификатор ровно n или m раз

Тема в разделе "Регулярные выражения", создана пользователем Disher, 11 авг 2009.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Disher

    Disher Постоялец

    Регистр.:
    25 июл 2009
    Сообщения:
    90
    Симпатии:
    8
    Подскажите пожалуйса, каким образом указать квантификатор, чтобы составить регулрку для поиска, например такой конструкции [0-9]+\s с повторениями ровно 7 или 10 раз. В мануале написано только {n} - ровно n раз, {n,m} - от n до m раз включительно. А мне надо, ровно n или m раз. Или же придется разбивать на два рег выражения?
     
  2. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Просто в регулярке напишите 2 шаблона разделив их "|" (или)
    '#([0-9]{7})\s|([0-9]{10})\s#'
     
    Disher нравится это.
  3. Disher

    Disher Постоялец

    Регистр.:
    25 июл 2009
    Сообщения:
    90
    Симпатии:
    8
    Спасибо. Думал, что имеется какое-нибудь стандартное решение. В итоге сделал так (благодаря Вашему совету:(
    PHP:
    ('#^([0-9]+\s+){'$cols_sr10 .'}[0-9]+$|^([0-9]+\s+){'$cols_sr13 .'}[0-9]+$#',$line)
     
  4. ZuArt

    ZuArt Создатель

    Регистр.:
    11 фев 2008
    Сообщения:
    16
    Симпатии:
    4
    Можно и без "или"...

    '#([0-9]{7}([0-9]{3})?)\s#'
     
  5. andrnag

    andrnag

    Регистр.:
    26 мар 2008
    Сообщения:
    350
    Симпатии:
    124
    ZuArt в таком случае вторую группу можно делать не простыми скобками, а без образования обратной ссылки, т.к. бессмыслено получать только последние три символа. Это будет выглядеть так:
    '#([0-9]{7}(?:[0-9]{3})?)\s#'

    И плюс с том, что не будет создана обратная ссылка $2, просто все число можно бубдет получить как $1

    И еще, я бы написал покороче

    '#(\d{7}(?:\d{3})?)\s#'
     
    Disher нравится это.
Статус темы:
Закрыта.