Здравствуйте, VladD2, Вы писали:
VD>Можно конечно подфиксить... создавать для каждого выражения статический регексп и указыват фалг Compiled, но все это полумеры. По уму нужно просто доработать напильником генератор лексеров konsoletyper-а:
По уму это конечно хорошо.
Но сделать полумеру очень просто и даст заметный результат (на порядок примерно...), а делать по уму... это нужно долго и нудно делать.
Можно конечно заняться но на это нужно много времени.
А слегка похачить этот макрос много времени не нужно.
VD>Так что правильным решением было бы просто отакзаться от МС-ных регекспов и заменить их на полноценную реализацию, или что еще лучше, вообще перейти на EBNF и потихоничку приучить к этому все прогрессивное человечество (это я о юзании konsoletyper-овского движка, если кто не понял).
EBNF это конечно хорошо. Но для одноразового кода регехпы лучше ибо писать меньше.
Скажем нужно мне было логи распарсить.
Получилось вот что:
FileProcessor().
ProcessLines(inFileName, outFileName, lines => lines.
MapLazy(line => regexp match (line) {
| @"[^:]+:(?<time>\d+:\d+:\d).*\]\s*(?<ip>\S+).*" => Some((time, ip))
| _ => None()
}).
FilterOptionalLazy().
GroupLazy((x, y) => x[0] == y[0]).
MapLazy(seq => seq.
CountAllToArray().
SortInplace((x, y) => y[0] - x[0]).
MapLazyFiltered
( (count, _) => count > 100
, fun(count, (time, ip)) { $"$time $count $ip" }
)
).
FlattenLazy()
);
Но декларативность данного решения меня не устраивает.
Хочется чегото типа такого
FileProcessor().
ProcessLines(inFileName, outFileName, StreamFilter {
RegexFilteredMap(| @"[^:]+:(?<time>\d+:\d+:\d).*\]\s*(?<ip>\S+).*") //{time : string, ip : string}
Group(time)
Map(
Count() //{count : int, value : {time : string, ip : string}}
Filter(count > 100)
Sort(-count)
Map($"$(value.time) $count $(value.ip)")
)
Flatten()
});
А тащить сюда EBNF это просто оверкилл.
... << RSDN@Home 1.2.0 alpha rev. 673>>