В тексте не более 3х повторяющихся символов

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

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

    B0nuse Постоялец

    Регистр.:
    6 июн 2009
    Сообщения:
    106
    Симпатии:
    21
    Прошу помощи в составлении регулярного выражения.
    Необходимо принять только то слово, в котором нет повторяющихся более трех раз символов.
    Дано:
    Код:
    a
    bb
    ccc
    dddd
    aabb
    aaab
    ffffe
    aabbbcc
    aaavvvvcccc
    Необходимо получить:
    Код:
    a
    bb
    ccc
    [S]dddd[/S]
    aabb
    aaab
    [S]ffffe[/S]
    aabbbcc
    [S]aaavvvvcccc[/S]
    и прочие варианты...
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    558
    PHP:
    if(preg_match("/[^\s]*?(.)[^\s]*?(\\1)[^\s]*?(\\1)[^\s]*?(\\1)[^\s]*?(\s|\Z)/is",'baabbccb')){
        echo 
    " более трех раз символов.";
        
    }else{
       echo 
    " нормально "
    }  
    ужас получился, вроде всё нормально, это случайно не задача из собеседования- помнится на харбре её показывали и нормальное решение писали.
     
    B0nuse нравится это.
  3. B0nuse

    B0nuse Постоялец

    Регистр.:
    6 июн 2009
    Сообщения:
    106
    Симпатии:
    21
    Спасибо, нет. Не из собеседования.
    Но обращаю Ваше внимание на то, что нужна регулярка обратная Вашей.
    Допустымые сиволы в слове
    Код:
    [ \-=_a-zA-Zа-яА-Я0-9\#\[\]\{\}\(\)\@\|\.]
     
  4. Oleg_Ci

    Oleg_Ci Создатель

    Регистр.:
    11 окт 2009
    Сообщения:
    25
    Симпатии:
    7
    Я тоже мозги поломал посидел, возможно одной регуляркой сделать и нельзя. Проще функцию накалякать :) скажем такую:
    PHP:
    $str "a
    bb
    ccc
    dddd
    aabb
    aaab
    ffffe
    aabbbcc
    aaavvvvcccc"
    ;

    $res fun($str);
    foreach(
    $res as $val)
        echo 
    $val."<br>";



    function 
    fun($str){
        
    $ar preg_split("/[\r\n]+/"$str);
        
    $res = array();
        
    $reg '/([ \-=_a-zA-Zа-яА-Я0-9\#\[\]\{\}\(\)\@\|\.])(\1{3})/i';

        for(
    $i=0$i<count($ar); $i++)
            if(!
    preg_match($reg$ar[$i]))
                
    $res[] = $ar[$i];

        return 
    $res;
    }
     
  5. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    558
    проще но как я понял- тз нужно именно регулярку ведь просто поставив отприцание перед if(preg_match("/[^\s]*?(.)[^\s]*?(\\1)[^\s]*?(\\1)[^\s]*?(\\1)[^\s]*?(\s|\Z)/is",'baabbccb')){ можно было получить нужное.
    увы после пляски с условными масками и негативным поиском- ничего не дали.
     
Статус темы:
Закрыта.