Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.26;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
15-1243198856
Германн
2009-05-25 01:00
2009.07.26
Странный глюк с текстовым файлом


2-1243948042
jz
2009-06-02 17:07
2009.07.26
изменялся ли checkbox


2-1243856641
Black
2009-06-01 15:44
2009.07.26
Пара вопросов и траблов


15-1243085085
Gooseman
2009-05-23 17:24
2009.07.26
Компьютерный глюк или вирус... Как лечить?


2-1243865113
Midi
2009-06-01 18:05
2009.07.26
эмулятор миди порта