Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Misha v.3 23.08.2011 16:54 / 24.08.2011 07:24
быстренько набросал свой вариант оператора rsplit (подробно не тестировал. структура результирующей таблицы изменилась).@main[] $cnt(9999) $t[^table::create{text regex options method col res check 12:01. 14:05, 18:00,21:20 Спортивные новости [,\.]\s? rsplit0 piece 12:01 14:05 18:00 21:20 Спортивные новости 0 warming up 12:01. 14:05, 18:00,21:20 Спортивные новости [,\.]\s? rsplit0 piece 12:01 14:05 18:00 21:20 Спортивные новости 1 2004-12-22 13:30 [^^0-9] r rsplit0 piece 30 13 22 12 2004 1 2004/12//22 /{1,2} r rsplit0 piece 22 12 2004 1 1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30 / l rsplit0 piece 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 12:01. 14:05, 18:00,21:20 Спортивные новости [,\.]\s? rsplit1 1 12:01 14:05 18:00 21:20 Спортивные новости 1 2004-12-22 13:30 [^^0-9] r rsplit1 1 30 13 22 12 2004 1 2004/12//22 /{1,2} r rsplit1 1 22 12 2004 1 1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30 / l rsplit1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 }] ^memory:compact[] ^t.menu{ ^do[$t.text;$t.regex;$t.options;$t.method;$t.col;$t.res;$t.check] ^memory:compact[] } @do[text;regex;options;method;column;valid;doCheck][m;i;parts;v] $m[$$method] ^Erusage:measure{^for[i](0;$cnt){$parts[^m[$text;$regex;$options]]}}[v] ^if($doCheck){ <hr /> ^check[$text;^parts.menu{$parts.$column}[ ];$valid] Time: $v.time ms<br /> KB: $v.memory_kb } @check[text;res;valid] $text => $res -- ^if($res eq $valid){OK}{<b>FAIL</b>}<br /> @rsplit0[text;regex;delimiter][table_split] ^if(def $text && def $regex){ $table_split[^table::create{piece}] $result[^text.match[(.*?)(?:$regex)][g]{^if(def $match.1){^table_split.append{$match.1}}}] ^if(def $result){^table_split.append{$result}} ^if(!def $delimiter){$delimiter[lv]} ^switch[^delimiter.lower[]]{ ^case[r;rv;vr]{$result[^table::create[$table_split;$.reverse(1)]]} ^case[rh;hr]{$result[^table::create[$table_split;$.reverse(1)]]$result[^result.flip[]]} ^case[h;lh;hl]{$result[^table_split.flip[]]} ^case[DEFAULT]{$result[$table_split]} } }{ ^throw[parser.runtime;rsplit;parameters ^$text and ^$regex must be defined] } @rsplit1[text;regex;delimiter][table_split] ^if(def $text && def $regex){ $result[^text.match[(.+?)(?:$regex|^$)][g]] }{ $result[^table::create[nameless]{}] } ^if($result && def $delimiter){ ^if(^delimiter.pos[r]>=0 || ^delimiter.pos[R]>=0){ $result[^table::create[$result;$.reverse(true)]] } ^if(^delimiter.pos[v]>=0 || ^delimiter.pos[V]>=0){ $result[^result.flip[]] } }у меня на компе результаты такие:
12:01. 14:05, 18:00,21:20 Спортивные новости => 12:01 14:05 18:00 21:20 Спортивные новости -- OK Time: 205.004 ms KB: 14616 2004-12-22 13:30 => 30 13 22 12 2004 -- OK Time: 210.003 ms KB: 16512 2004/12//22 => 22 12 2004 -- OK Time: 165.002 ms KB: 12404 1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30 => 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 -- OK Time: 720.012 ms KB: 64264 12:01. 14:05, 18:00,21:20 Спортивные новости => 12:01 14:05 18:00 21:20 Спортивные новости -- OK Time: 100.001 ms KB: 3812 2004-12-22 13:30 => 30 13 22 12 2004 -- OK Time: 115.002 ms KB: 5696 2004/12//22 => 22 12 2004 -- OK Time: 105.002 ms KB: 5452 1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30 => 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 -- OK Time: 220.003 ms KB: 22460т.е. новый rsplit1 работает в ~2 раза быстрее, использует в ~2 раза меньше памяти и занимает в 1.7 раза меньше байтиков :)