За последние 24 часа нас посетили 21598 программистов и 1023 робота. Сейчас ищет 721 программист ...

"И" в регулярках...

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

  1. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Всем привет!
    Толи я туплю под вечер, толи не знаю чего...
    В общем никак не удаётся составить регулярное выражение.
    Нужно, чтобы регулярке удовлетворяла строка, в которой есть определённые символы в любой последовательности. Т.е., например, в ней должны присутствовать символы a, b и с - обязательно все. Последовательность - любая. Например, следующие строки должны пройти регулярку:

    abc
    cba
    xbxaacxx
    xcbax
    bac

    а следующие строки - не должны пройти:

    aab
    bcb
    xxaxaaxbxx
    xaxbx

    Совсем завис... Я думал, тут будет что-то вроде

    /(a+)&(b+)&(c+)/

    однако это не работает. Пересматривал описание регулярок и... вообще не вижу такого понятия, как "И" в регулярках. "ИЛИ" - вижу, "И" - нет :-(
     
  2. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Нету такого. Только через "или" описывая все комбинации, типа (a.*b.*c|b.*a.*c| ... и так далее
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Спасибо! :) Да, если б условий было больше чем 3... :)
     
  4. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Имхо, самое оптимальное - это несколько функций проверки. Если задача описана как она есть - то вообще без регулярок, а поиском подстроки.

    Еще можно регуляркой выкусить все "не искомые" символы, убить повторы и посмотреть длину. Или отсортировать символы строки и регуляркой уже искать известную последовательность.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    sobachnik
    если на русский язык эти "условия" переведешь - то реализовать их будет несложно
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    По поводу нескольких функций проверки - именно так у меня и было изначально, что-то вроде
    if(preg_match($preg1, $str) and preg_match($preg2, $str) and preg_match($preg3, $str))
    но начальник попросил написать одной регуляркой (это скорее уже связано с несостыковками с документацией по проекту, а не с реальными какими-то плюсами или минусами)
    Задача, да, несколько упрощена, под a, b и c я понимал определённые символьные классы. Но в принципе всё решилось, наверно криво, но удалось сделать одной регуляркой :)
    igordata, да вроде всё и так на русском написано :) А вообще, нужно проверить, чтобы в строке присутствовал хотя бы один символ из одного символьного класса, хотя бы один из другого и хотя бы один из третьего. Последовательность символов может быть любой.
     
  7. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Ты бы лучше задачу сформулировал, оно всегда веселее, чем абстрактные а и б гонять.
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Пароль должен содержать хотя бы одну маленькую букву (русскую или английскую), хотя бы одну большую букву (русскую или английскую) и хотя бы одну цифру. Длина пароля не менее 8 символов. При этом он не автоматом генерится, а пользователь сам его придумывает. Это ещё упростили заказчики, изначально хуже было (пароль должен был отвечать трём из 4х требований - маленькие буквы, большие буквы, цифры, символы). Если несколькими регулярками - делается легко, никаких проблем. А одной регуляркой... криво и длинно :)
     
  9. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    ((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,})
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    sobachnik
    да вроде всё и так на русском написано
    "вот эти должны пройти а вот эти не должны" =) это не то чтобы совсем не сформулировал, но не на русском точно :D

    sobachnik
    Пароль должен содержать хотя бы одну ляляля пупупу
    мне кажется что не правильно делать это одной регуляркой. надо проверить всеми "правилами" отдельно
     
  11. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Круть какая! :) Спасибо! И одной регуляркой, и не длинно и, наверно, не криво! :)
    Теперь осталось снова перечитать мануал и понять, как это работает )))