Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

RegExp проблема [D7]


Леххха ©   (2009-06-03 15:28:00) 

Всем привет,

Есть документ в котором находятся строки типа:

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 19:08:00) [1]


> мы априорно точно знаем, что строки начинаются на дату в
> одном из двух форматов


Тут, Пятачок, облажаться можно как на раз-два)

Сейчаст автор оглобли развернет в очер.раз, и окажется что искомое им вполне может оказаться в лунном формате на лунном же месте во Вселенной)

Я бы не делал резких телодвижений - пусть автор успокоится-прожует, переосмыслимт что он тут налепил всуе и выдвинет нечто нормально сформулированное, с примерами всехвозможных вариантов исходных строк ..

А то взяли, панимаишь, привычку блаблаблакать где ни попадя - нате, мол, вам, жуйте невесть что, а мне, мол, готовое "пюре" подавайте)


Медвежонок Пятачок   (2009-06-03 18:26:00) [2]

внутри цикла если уж использовать регулярку, то с пользой.
она должна сказать, что дата в строке в том или этом формате.
твое выражение про это ничего не говорит.
это можно лишь косвенно понять по длине мача (если они вообще разные).

но раз так, то задача сводится к банальной проверке стоит ли в нужной позиции (перед blablabla) пробел.
если да, то первый вариант, если нет, то второй.

то есть обычный if str[x] = 'y'


Медвежонок Пятачок   (2009-06-03 18:14:00) [3]

теперь еще стоит задуматься над тем, а что же мы тут делаем вообще?

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


Медвежонок Пятачок   (2009-06-03 18:05:00) [4]

Match the character "]" «[]]»

<Цитата>

А не нагляднее ли и не менее накладнее ли будет просто маскирование скобки '\]'?

Зачем его заряжать на проверку перечня, если в перечне всего один символ?


Медвежонок Пятачок   (2009-06-03 17:53:00) [5]

тогда все равно см. [9]


Леххха   (2009-06-03 17:07:00) [6]

Вы что-то перепутали он ищет либо \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 16:30:00) [7]

А вот эти перечни каждый из одного символа для чего?

[[]

[]]


Медвежонок Пятачок   (2009-06-03 16:27:00) [8]

допустим даже что регулярка сработала, но для второго варианта строки.
затем идет простой StrTodatetime который ничего про такой формат даты не знает.


Медвежонок Пятачок   (2009-06-03 16:19:00) [9]

то есть выражение стрельнет для строки в которой начало такое:

\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:16:00) [10]

| - это актуально только для выражения слева и справа от палки.
одного выражения, а не всего что слева и справа целиком


Медвежонок Пятачок   (2009-06-03 16:10:00) [11]

но по какой-то причине она не работает

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:09:00) [12]

Тема называется RegExp и если человек посмотрел регулярное выражение в коде , то ему ясно что там два формата даты


Медвежонок Пятачок   (2009-06-03 16:07:00) [13]

щас приведут еще одно решение без регулярок и выяснится что есть еще третий вариант даты


Andy BitOff   (2009-06-03 16:07:00) [14]


> Леххха   (03.06.09 15:54) [2]

Ответ в [1] верен, т.к. из приведенного тобой в [0] не следует, что "дата может быть в разных форматах"


Леххха   (2009-06-03 15:54:00) [15]

Ваш вариант не подходит, т.к дата может быть в разных форматах.

первый \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 15:34:00) [16]

Зачем такие навороты?

Сheck := StrToDateTime(Copy(SL[i], 1, 19));

И все. Просто, как веник и никаких регвыражений.


Наверх

Титульная страница Поиск, карта сайта Написать письмо