Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1243948042
jz
2009-06-02 17:07
2009.07.26
изменялся ли checkbox


15-1243404241
Unknown user
2009-05-27 10:04
2009.07.26
Windows Forms


15-1243198856
Германн
2009-05-25 01:00
2009.07.26
Странный глюк с текстовым файлом


2-1243843842
девушка
2009-06-01 12:10
2009.07.26
cxGrid как SelectedRecordCount на нижнем уровне


15-1242993877
feel
2009-05-22 16:04
2009.07.26
Програмирование загрузочного сектора.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский