Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм поиска года в строке!? вытащить 2009 из "ывалдо0_2009ывы_ыв22ы" 
V
    Опции темы
Nicholas
Дата 12.9.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Помогите не могу сообразить как такое сделать. smile

Допустим есть строка  "ывалдо0_2009ывы_ыв22ы" надо написать функцию которая сможет вытащить из строки "2009" и сделает это с любым годом будь это 1900 или 1982 или 2008 smile ну никак не могу придумать.

п.с. Посимвольно в цикле строку прокручивал, проверял явзяется ли символ числом и т.д. и т.п. нифган е получается )))
PM MAIL ICQ   Вверх
Romikgy
Дата 12.9.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



regexp те в помощь ,
или просмотр строки посимвольно с поиском 4 цифр подряд (которые начинаются на 19 или 20 )


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 12.9.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



 Нижнее подчеркивание всегда присутствует перед годом?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Nicholas
Дата 12.9.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Цитата(Alexeis @ 12.9.2009,  14:44)
Нижнее подчеркивание всегда присутствует перед годом?

Нет.
Может покажите пример с посимвольным перебором?
PM MAIL ICQ   Вверх
Alexeis
Дата 12.9.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Nicholas @  12.9.2009,  13:53 Найти цитируемый пост)
Нет.
Может покажите пример с посимвольным перебором? 

  Функция PosEx , StrUtils. Ищет подстроку в строке. Строку нужно искать '19' и '20' а затем проверять 2 последующих символа.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Nicholas
Дата 12.9.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Ну не хочется мне искать 19 и 20, хочу чтобы искал любое 4-х значное число в строке, т.к. кроме года в строке других 4-х значных чисел нет.

Вот набросал код  - работает, но получился сильно громоздкий. Облагородьте его пожалуйста! ;)

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function IsDid(ch:string):bool;
begin
  if Pos(ch,'0123456789') <> 0 then
    result:=true
    else
    result:=false;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
st:string;
i,chCount,preChCount:integer;
ch:string[1];
year:string[4];
begin
st:='lkjkljkljlk544_2009fsd54s53f3';
year:='';
chCount:=0;
preChCount:=0;
for I := 1 to length(st) do
begin
  ch:=Copy(st,i,1);
   Memo1.Lines.Add('символ:'+ch);
   
  if IsDid(ch) = true then
  begin
  preChCount:=preChCount+1;
  chCount:=chCount+1;
  Memo1.Lines.Add('символ - число, счетчик сиволов='+IntToStr(chCount));

  if (chCount < 5) and (preChCount>0) then
    begin
    year:=year+ch;
    if chCount = 4 then
      Begin
      Memo1.Lines.Add('Год:'+year);
      End;
    end else
  begin
    chCount:=0;
    year:='';
  end;
  end else
  // if IsDid(ch) = false 
  begin
  preChCount:=preChCount-1;
  chCount:=0;
  year:='';
  if preChCount < 0  then
  preChCount:=0 else
  end;
end;
  

end;

end.


PM MAIL ICQ   Вверх
Alexeis
Дата 12.9.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Nicholas @  12.9.2009,  14:28 Найти цитируемый пост)
хочу чтобы искал любое 4-х значное число в строке

  Тогда регуляркой
 [^1234567890] {1}(19|20)[1234567890]{2}[^1234567890] {1}

т.е. перед и после года все что угодно кроме цифр, затем 19 или 20 затем еще 2е любые цифры


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Nicholas
Дата 12.9.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Цитата(Alexeis @ 12.9.2009,  15:44)
  Тогда регуляркой
 [^1234567890] {1}(19|20)[1234567890]{2}[^1234567890] {1}

Первый раз такое вижу! smile Как это выглядит в коде?
 smile 
PM MAIL ICQ   Вверх
Romikgy
Дата 12.9.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



\d{4}


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Keeper89
Дата 12.9.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Ну если совсем просто, то можно так:
Код

procedure GetAllUears(const str: String; var yList: TStringList);
const
  YEAR_LENGTH = 4;
var
  i: Integer;
  yearStr: String;
  myYear: Integer;
begin
  yList.Clear;
  for i := 0 to Length(str) - YEAR_LENGTH do
  begin
    yearStr := Copy(str, i, YEAR_LENGTH);
    if TryStrToInt(yearStr, myYear) then
      yList.Add(yearStr)
  end;
end;



--------------------
PM MAIL WWW   Вверх
Nicholas
Дата 12.9.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Цитата(Keeper89 @ 12.9.2009,  16:13)
Ну если совсем просто, то можно так:
Код

procedure GetAllUears(const str: String; var yList: TStringList);
const
  YEAR_LENGTH = 4;
var
  i: Integer;
  yearStr: String;
  myYear: Integer;
begin
  yList.Clear;
  for i := 0 to Length(str) - YEAR_LENGTH do
  begin
    yearStr := Copy(str, i, YEAR_LENGTH);
    if TryStrToInt(yearStr, myYear) then
      yList.Add(yearStr)
  end;
end;

smile)) Ну я тупанул! 

Но,не твой ни мой код вот такую строку st:='lkj20062007kljkljlk544_2009fs2005d54s53f3'; не обрабатывает так,что выводились только года.

Добавлено через 4 минуты и 1 секунду
Вот так вроде работает:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
st:string;
i,chCount,preChCount:integer;
ch:string[1];
year:string[4];
begin
//st:='lkjkljkljlk544_2009fsd54s53f3';
st:='lkj20062007kljkljlk544_2009fs2005d54s53f3';
year:='';
chCount:=0;
preChCount:=0;
for I := 1 to length(st) do
begin
  ch:=Copy(st,i,1);
 //  Memo1.Lines.Add('символ:'+ch);

  if IsDid(ch) = true then
  begin
  preChCount:=preChCount+1;
  chCount:=chCount+1;
//  Memo1.Lines.Add('символ - число, счетчик сиволов='+IntToStr(chCount));

  if (chCount < 5) and (preChCount>0) then
    begin
    year:=year+ch;
    if chCount = 4 then
      Begin
      Memo1.Lines.Add('Год:'+year);
      chCount:=0;
      year:='';
      End;
    end;
  end else
  // если символ не цифра
  begin
  preChCount:=preChCount-1;
  chCount:=0;
  year:='';
  if preChCount < 0  then
  preChCount:=0 else
  end;
end;

PM MAIL ICQ   Вверх
Keeper89
Дата 12.9.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Nicholas, при подобном парсинге надо точнее указывать условия.
Код

procedure GetAllYears(const str: String; var yList: TStringList);
const
  YEAR_LENGTH = 4;
var
  i: Integer;
  yearStr: String;
  myYear: Integer;
begin
  yList.Clear;
  for i := 0 to Length(str) - YEAR_LENGTH do
  begin
    yearStr := Copy(str, i, YEAR_LENGTH);
    if (TryStrToInt(yearStr, myYear)) and
       (StrToInt(Copy(yearStr, 1, 2)) in [19, 20]) then
      yList.Add(yearStr)
  end;
end;



--------------------
PM MAIL WWW   Вверх
Nicholas
Дата 12.9.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Keeper89, спасибо! Давно не запускал Delphi - все забыл... 
PM MAIL ICQ   Вверх
Keeper89
Дата 12.9.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Nicholas, пожалуйста. И закрывай тему ;)


--------------------
PM MAIL WWW   Вверх
Nicholas
Дата 12.9.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Цитата(Keeper89 @ 12.9.2009,  16:59)
И закрывай тему ;)

Закрою, так только ты скажешь как заставить твою процедуру работать с вот этой строкой 'jhhk4cp_tr1_640x000iii2008' smile




Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  __________1.jpg 23,29 Kb
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0876 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.