[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Задача на регулярки
DedMorozzz
Такс, выдалось свободное время - предложите интересную задачку на регулярное выражение. Почему именно регулярки - с ними наиболее "чистые" и интересные алгоритмы. В общем - рассмотрю любые предложения smile.gif



Спустя 1 минута, 15 секунд (27.07.2010 - 12:35) linker написал(а):
DedMorozzz
Видимо хотел сказать, сложно понимаемые и медленно работающие алгоритмы?

Спустя 3 минуты, 51 секунда (27.07.2010 - 12:39) DedMorozzz написал(а):
Отчего же. Я вовсе иные цели преследую. К примеру - отличная зарядка для мозгов. И это при том, что не надобно писать тонны кода. Достаточно пару строк.

Спустя 48 минут, 35 секунд (27.07.2010 - 13:28) ApuktaChehov написал(а):
Могу предложить несложную регулярку на отделения числовых разрядов. К примеру: есть число 6340234.334 нужно из него сделать: 6 340 234.334

Спустя 1 минута, 11 секунд (27.07.2010 - 13:29) linker написал(а):
ApuktaChehov
Есть уже готовая функция в PHP

Спустя 1 минута, 3 секунды (27.07.2010 - 13:30) ApuktaChehov написал(а):
Какая разница есть или нет. На регулярках это нежно реализовать. Вот ты знаешь как это сделать? Я нет sad.gif

Спустя 56 минут, 58 секунд (27.07.2010 - 14:27) DedMorozzz написал(а):
ага, увидал. Ну походу зедесь лишь через цикл. Как-то так:
$a="6340234.334";
do{
$b=$a;
$a=preg_replace('#([0-9]+)([0-9]{3})( ?\.?[0-9]*)#','$1 $2$3',$a);
}
while($b!=$a);
echo $a;//6 340 234.334

Спустя 8 минут, 36 секунд (27.07.2010 - 14:35) Wird_34 написал(а):
А почему именно регулярные выражения? Думаю мозг можно размять например классическими задачами по программированию вроде ханойских башен, обедающих философов, двух генералов и других. Вроде как PHP-программисты их не прорешивают и мне кажется, что зря.

Спустя 2 часа, 20 минут, 21 секунда (27.07.2010 - 16:56) ApuktaChehov написал(а):
Не, не через цикл. Я книгу читал, там пример есть как на чистых регулярках это сделать. Там используется опережающая проверка.

Если интересно, могу дома порыться wink.gif

Спустя 3 минуты, 39 секунд (27.07.2010 - 16:59) DedMorozzz написал(а):
без цикла...ок, подумаю. Вот это уже интересней. Ибо на решение ЭТОЙ задачи ушло минут 10)

Спустя 1 минута, 56 секунд (27.07.2010 - 17:01) ApuktaChehov написал(а):
Кстати, там пример реализации для любых чисел. А тут как я понял, конкретно под мою цифру.

Спустя 1 минута, 27 секунд (27.07.2010 - 17:03) DedMorozzz написал(а):
нет. Тут под любую smile.gif)) Зачем тока под 1

Спустя 31 секунда (27.07.2010 - 17:03) Joker написал(а):
напиши регулярку на извлечения телефонов сотовый домашних из текста я так учился...

Спустя 2 минуты, 25 секунд (27.07.2010 - 17:06) DedMorozzz написал(а):
Учиться? С регулярками у меня всё отлично) Хотя всегда есть чему учиться. Но у них отличные алгоритмы, чем они и привлекают. Твоя задача достаточно проста, и как следствие - мало интересна

Спустя 2 часа, 38 минут, 27 секунд (27.07.2010 - 19:44) ApuktaChehov написал(а):
Вот еще задачка. Тут уже было что подобное, но цель была другая.

Значит есть строка:
У {попа|отца|деда} была {собака|кошка|лошадь} он ее {любил|ненавидел|призерал}, она съела кусок {мяса|хлеба} он ее убил.

Нужно с помощью регулярного выражения разбить это строку. Вертикальная черта должна оставаться. Фактически нужно разбить строку на подстроки, так чтобы получился массив со значениями вне фигурных скобок и внутри фигурных скобок.

Поулчится что то:
$arr[0] => 'У ',
$arr[1] => 'попа|отца|деда' и так далее.

P.S. У меня случайно получилось так это реализовать. Но теперь удобно работать, так как у нас отдельно строка и отдельно варианты выбора через |.

Спустя 39 минут, 38 секунд (27.07.2010 - 20:24) Reflex написал(а):
define('REGEXP', '#(?<={)(.*?)(?=})|(?<=})(.*?)(?={)|^(.*?)(?={)|(?<=})(.*?)$#');
$data = 'У {попа|отца|деда} была {собака|кошка|лошадь} он ее {любил|ненавидел|призерал}, она съела кусок {мяса|хлеба} он ее убил.';
preg_match_all(REGEXP, $data, $matches);
print_r($matches[0]);

Array
(
[0] => У
[1] => попа|отца|деда
[2] => была
[3] => собака|кошка|лошадь
[4] => он ее
[5] => любил|ненавидел|призерал
[6] => , она съела кусок
[7] => мяса|хлеба
[8] => он ее убил.
)


Отдельное спасибо DedMorozzz'у, от которого я узнал про просмотр назад и вперёд.

Спустя 1 час, 18 минут, 32 секунды (27.07.2010 - 21:42) ApuktaChehov написал(а):
Вот я нашел свою старую реализацию. Она немного отличается от той что я тут задал, но все же выложу:
$data = 'У {попа|отца|деда} была {собака|кошка|лошадь} он ее {любил|ненавидел|призерал}, она съела кусок {мяса|хлеба} он ее убил.';

preg_match_all('/([^{]*){([^}]*)}/', $data, $arr);


результат:

[1] => Array
(
[0] => У
[1] => была
[2] => он ее
[3] => , она съела кусок
)

[2] => Array
(
[0] => попа|отца|деда
[1] => собака|кошка|лошадь
[2] => любил|ненавидел|призерал
[3] => мяса|хлеба
)


P.S. Дедушка мороззз, жду от тебя вариант про циферки =)

Спустя 17 минут, 54 секунды (27.07.2010 - 22:00) DedMorozzz написал(а):
Да-да, завтра кину. Думаю будет время.

Спустя 15 часов, 52 минуты, 12 секунд (28.07.2010 - 13:52) DedMorozzz написал(а):
ApuktaChehov - лови, 1й регуляркой:
$a="6341214564654615361187210967.334";

$a=preg_replace_callback('#([0-9]+)(?=(\ |\.))#',create_function('$matches','
$long = strlen($matches[0]);
$b=(int)($long/3);
$res=$long-$b*3;
$d=substr_replace($matches[0],
\'\',0,$res);
$ost=substr_replace($matches[0],
\'\',$res);
$c=preg_replace(
\'#([0-9]{3})#\',\' $1\',$d);
$c=$ost. $c;
return($c);'
),$a);
echo $a;//6 341 214 564 654 615 361 187 210 967.334

Цикл выглядит, как минимум - эстетичнее (: Но зато тут логика попроще будет, хотя сама реализация - существенно сложнее.

Спустя 2 часа, 50 минут, 45 секунд (28.07.2010 - 16:43) ApuktaChehov написал(а):
Жесть blink.gif А бы до такого никогда бы не додумался. Ты гений wink.gif
Вечером в книге посмотрю, как там это сделано. Там именно одно регулярное выражение.

Спустя 9 минут, 31 секунда (28.07.2010 - 16:53) DedMorozzz написал(а):
В принципе работать должно быстрее чем в цикле и даже быстрее любого иного решения smile.gif Поскольку сперва выгребается всё по очень простому условию, далее собраный результат обрабатываеться строковыми ф-ями. И обработаный результа снова таки по очень простому шаблону(проще в принципе никак smile.gif ) заменяется smile.gif

Спустя 2 минуты, 13 секунд (28.07.2010 - 16:55) ApuktaChehov написал(а):
Алгоритм я понял твой. Но реализация меня удивила. Очень эффектно!

Спустя 6 минут, 31 секунда (28.07.2010 - 17:01) DedMorozzz написал(а):
Тема актуальна...
Если у кого-то будут какие-либо предложения - рассмотрю smile.gif

Спустя 2 часа, 3 минуты, 42 секунды (28.07.2010 - 19:05) ApuktaChehov написал(а):
Во, нашел выражение:
$data = '32345432411,123';

echo( preg_replace("/(?<=\d)(?=(\d\d\d([,.][0-9]*)?)+$)/", ' ', $data) );


P.S. Я его немного доработал. Что бы оно так же корректно работало с возможной дробной частью.

Глядя на такую красоту, завидую тем, кто отлично ладит с регулярками.

Спустя 29 минут, 9 секунд (28.07.2010 - 19:34) DedMorozzz написал(а):
Да, намного красивее smile.gif
Ну а что касаеться скорости - завтра мб проверю. Гляну что быстрее smile.gif

Спустя 17 часов, 31 минута, 44 секунды (29.07.2010 - 13:06) DedMorozzz написал(а):
Вот это да!!! Даже не ожидал такого:
Мой алгоритм - time: 0.00633383 s
Алгоритм в книге - time: 4.46954417 s
1й алгоритм быстрее 2го в 705,66216175678854658239959076893 раза smile.gif
строку на проверку -
Свернутый текст
"323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411323454123213213213123131111111111111818181818273891365476834532411.123"

Вывод: в программировании фраза "Красота спасёт мир", как минимум - не уместна smile.gif
ЗЫ: Бог Книга vs DedMorozzz - 0:1 laugh.gif

Спустя 1 месяц, 1 день, 23 часа, 23 минуты, 56 секунд (31.08.2010 - 12:30) DedMorozzz написал(а):
Продолжение банкета.
Интересная задачка: "Проверить строку на уникальность. Т.е. что бы не один символ не повторялся".

Код:

$user_text = 'asskxlzxpa';

$Unique_content = preg_replace_callback('#(.*)#',create_function('$matches','

$a = $matches[0];
$len = strlen($a);
$err =
\'\';
for($i=0;$i<$len;$i++){
$end_len = $len-$i;
for($j=0;$j<$end_len;$j++){

if(!preg_match(
\'#^.{\'.$i.\'}(\'.$a[$i].\').{\'.$j.\'}(?!\\1)#\',$a))
$err.=
\'Position - \'.($i+1).\' and \'.($i+$j+2).\'. Symbol - "\'.$a[$i].\'"<br />\';
}
}

if (empty($err)) return
\'All Good!\';
else return
\'Recurrence found!<br />\'.$err;

'
),$user_text,1);
echo $Unique_content;

или вариант по проще:
$user_text = 'askxslzp';
if(preg_match('#(.).*?\\1#',$user_text)) echo "Recurrence found!";
else echo "All Good!";

Спустя 23 дня, 21 час, 46 минут, 47 секунд (25.09.2010 - 10:17) RockBoy написал(а):
DedMorozzz
скажи как скорость регулярки затестить?

Спустя 5 часов, 26 минут, 7 секунд (25.09.2010 - 15:43) DedMorozzz написал(а):
microtime() до и после регулярки. И вычитай. Из большего - меньшее. Разница - время выполнения.


_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.