Форум: "Начинающим";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];
ВнизRegExp проблема Найти похожие ветки
← →
Леххха (2009-06-03 15:28) [0]Всем привет,
Есть документ в котором находятся строки типа:
2009-06-20 14:23:23 blablabla
2009-07-20 14:23:23 blablabla
2009-08-20 14:23:23 blablabla
2009-09-20 14:23:23 blablabla
2009-10-20 14:23:23 blablabla
2009-11-20 14:23:23 blablabla
Задача состоит в том чтобы определить индекс строки которая
больше или равна startdate.
Вот функция которой я пытаюсь определить, но по какой-то причине она не работает,гляньте скажите что не так:
по поводу Sl он создаётся заранее и загружает в себя этот файл.
function TExtractThread.GetDateFirst:integer;
var
dat:string;
check:Tdatetime;
i:integer;
begin
result:=0;
DateSeparator := "-";
TimeSeparator := ":";
ShortDateFormat := "yyyy-MM-dd";
LongDateFormat := "yyyy-MM-dd";
ShortTimeFormat := "hh:mm:ss";
LongTimeFormat := "hh:mm:ss";
dat:="\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}|[[].{8}\d{2}.\d{2}:\d{2}:\d{2} \d{4}[]]";
d.Expression:=dat;
for i:=0 to sl.Count-1 do
begin
if d.Exec(sl[i])then
begin
check:=StrTodatetime(d.Match[0]);
if startdate>=check then
begin
result:=i;
exit;
end;
end;
end;
end;
← →
Юрий Зотов © (2009-06-03 15:34) [1]Зачем такие навороты?
Сheck := StrToDateTime(Copy(SL[i], 1, 19));
И все. Просто, как веник и никаких регвыражений.
← →
Леххха (2009-06-03 15:54) [2]Ваш вариант не подходит, т.к дата может быть в разных форматах.
первый \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}
Второй [[].{8}\d{2}.\d{2}:\d{2}:\d{2} \d{4}[]]
← →
Медвежонок Пятачок © (2009-06-03 16:07) [3]щас приведут еще одно решение без регулярок и выяснится что есть еще третий вариант даты
← →
Andy BitOff © (2009-06-03 16:07) [4]
> Леххха (03.06.09 15:54) [2]
Ответ в [1] верен, т.к. из приведенного тобой в [0] не следует, что "дата может быть в разных форматах"
← →
Леххха (2009-06-03 16:09) [5]Тема называется RegExp и если человек посмотрел регулярное выражение в коде , то ему ясно что там два формата даты
← →
Медвежонок Пятачок © (2009-06-03 16:10) [6]но по какой-то причине она не работает
dat:="\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}|[[].{8}\d{2}.\d{2}:\d{2}:\d{2} \d{4}[]]";
d.Expression:=dat;
и где второй вариант выражения для второго варианта даты?
по какой-то причине на работает. наверное по причине таяния полярных шапок марса.
← →
Медвежонок Пятачок © (2009-06-03 16:16) [7]| - это актуально только для выражения слева и справа от палки.
одного выражения, а не всего что слева и справа целиком
← →
Медвежонок Пятачок © (2009-06-03 16:19) [8]то есть выражение стрельнет для строки в которой начало такое:
\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:
затем либо две цифры либо [
\d{2}|[[]
после чего следует
.{8}\d{2}.\d{2}:\d{2}:\d{2} \d{4}[]]";
← →
Медвежонок Пятачок © (2009-06-03 16:27) [9]допустим даже что регулярка сработала, но для второго варианта строки.
затем идет простой StrTodatetime который ничего про такой формат даты не знает.
← →
Медвежонок Пятачок © (2009-06-03 16:30) [10]А вот эти перечни каждый из одного символа для чего?
[[]
[]]
← →
Леххха (2009-06-03 17:07) [11]Вы что-то перепутали он ищет либо \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}
либо это [[].{8}\d{2}.\d{2}:\d{2}:\d{2} \d{4}[]]
Вот что говорит RedexBuddy по поводу этого выражения изучайте:
Match either the regular expression below (attempting the next alternative only if this one fails) «\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}»
Match a single digit 0..9 «\d{4}»
Exactly 4 times «{4}»
Match the character "-" literally «-»
Match a single digit 0..9 «\d{2}»
Exactly 2 times «{2}»
Match the character "-" literally «-»
Match a single digit 0..9 «\d{2}»
Exactly 2 times «{2}»
Match a single character that is a "whitespace character" (spaces, tabs, line breaks, etc.) «\s»
Match a single digit 0..9 «\d{2}»
Exactly 2 times «{2}»
Match the character ":" literally «:»
Match a single digit 0..9 «\d{2}»
Exactly 2 times «{2}»
Match the character ":" literally «:»
Match a single digit 0..9 «\d{2}»
Exactly 2 times «{2}»
Or match regular expression number 2 below (the entire match attempt fails if this one fails to match) «[[].{8}\d{2}.\d{2}:\d{2}:\d{2} \d{4}[]]»
Match the character "[" «[[]»
Match any single character that is not a line break character «.{8}»
Exactly 8 times «{8}»
Match a single digit 0..9 «\d{2}»
Exactly 2 times «{2}»
Match any single character that is not a line break character «.»
Match a single digit 0..9 «\d{2}»
Exactly 2 times «{2}»
Match the character ":" literally «:»
Match a single digit 0..9 «\d{2}»
Exactly 2 times «{2}»
Match the character ":" literally «:»
Match a single digit 0..9 «\d{2}»
Exactly 2 times «{2}»
Match the character " " literally « »
Match a single digit 0..9 «\d{4}»
Exactly 4 times «{4}»
Match the character "]" «[]]»
← →
Медвежонок Пятачок © (2009-06-03 17:53) [12]тогда все равно см. [9]
← →
Медвежонок Пятачок © (2009-06-03 18:05) [13]Match the character "]" «[]]»
<Цитата>
А не нагляднее ли и не менее накладнее ли будет просто маскирование скобки "\]"?
Зачем его заряжать на проверку перечня, если в перечне всего один символ?
← →
Медвежонок Пятачок © (2009-06-03 18:14) [14]теперь еще стоит задуматься над тем, а что же мы тут делаем вообще?
а делаем мы странные вещи.
имеем список строк, про который мы априорно точно знаем, что строки начинаются на дату в одном из двух форматов.
далее мы тупо перебираем все строки и регулярками проверяем то, что нам и так известно. А именно то, что каждая строка начинается с даты, выраженной одним из двух вариантов представления.
← →
Медвежонок Пятачок © (2009-06-03 18:26) [15]внутри цикла если уж использовать регулярку, то с пользой.
она должна сказать, что дата в строке в том или этом формате.
твое выражение про это ничего не говорит.
это можно лишь косвенно понять по длине мача (если они вообще разные).
но раз так, то задача сводится к банальной проверке стоит ли в нужной позиции (перед blablabla) пробел.
если да, то первый вариант, если нет, то второй.
то есть обычный if str[x] = "y"
← →
Сергей М. © (2009-06-03 19:08) [16]
> мы априорно точно знаем, что строки начинаются на дату в
> одном из двух форматов
Тут, Пятачок, облажаться можно как на раз-два)
Сейчаст автор оглобли развернет в очер.раз, и окажется что искомое им вполне может оказаться в лунном формате на лунном же месте во Вселенной)
Я бы не делал резких телодвижений - пусть автор успокоится-прожует, переосмыслимт что он тут налепил всуе и выдвинет нечто нормально сформулированное, с примерами всех возможных вариантов исходных строк ..
А то взяли, панимаишь, привычку блаблаблакать где ни попадя - нате, мол, вам, жуйте невесть что, а мне, мол, готовое "пюре" подавайте)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c