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

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

Помогите сделать персер строки


Wadimka ©   (2012-07-19 23:23:00) 

Есть строка

Допустим есть такие строки:
Строка по: русски / line 98 in: English (данные 1) данные 2
Строка по русски / line in: 17 English данные 2 (данные 1)
как мне сделать на delphi чтоб в любом случае получилось в итоге

Строка по русски данные 1 (данные 2)
Строка по русски данные 2 (данные 1)

Смысл то что по русски до символа / или может быть -
оставить, потом удалить всю строку по англицки вксючая все символы, как числа, так и знаки - и /
а потом оставить после данных по англицки данные 2 (данные 1)

шота не догоню нихрена

пишу на delphi 7


Юрий Зотов   (2012-07-21 15:25:00) [1]


> > Wadimka  

Дело в том, что любой парсер ориентируется на правила грамматики входного языка. До тех пор, пока эти правила не сформулированы (притом однозначно), ничего сделать не получится - поэтому с их формулировки и надо начинать.


Юрий Зотов   (2012-07-21 15:11:00) [2]


> Wadimka   (20.07.12 21:18) [17]
> на php легко регуляркой делается

Еще раз - без ответов на вопросы [7] задача не имеет решения ПРИНЦИПИАЛЬНО. Хоть регуляркой, хоть на php, хоть как угодно иначе.

Пример русского названия фильма: "Оцеола - вождь семинолов".

И приплыла Ваша регулярка.


Inovet   (2012-07-20 22:21:00) [3]

> [17] Wadimka   (20.07.12 21:18)
> на php легко регуляркой делается

В Делфи сделай регуляркой.


Wadimka   (2012-07-20 21:18:00) [4]

на php легко регуляркой делается


Юрий Зотов   (2012-07-20 13:41:00) [5]


> Wadimka   (20.07.12 10:39) [8]
> Эти строки шаблоны,

Именно это я и предполагал. Значит, задача не имеет решения, пока не будет ответов на вопросы в [7]. А ответить на них можете только Вы - и пока не ответите, разговор не имеет смысла.

Жду.


AV   (2012-07-20 12:30:00) [6]


> Wadimka   (20.07.12 11:57) [12]
>
> можно проще тоже самое
>

и чем это проще? по моему тоже самое :)


Wadimka   (2012-07-20 12:28:00) [7]

так она не так работает


Inovet   (2012-07-20 12:17:00) [8]

> [9] Wadimka   (20.07.12 10:41)
> вот реальная строка
>
> Женщины и смерть / Women's Murder Club - 1 сезон, 13 серия (13)

Ну а чё врал тогда.


Wadimka   (2012-07-20 11:57:00) [9]

можно проще тоже самое

for i:=1 to Length(FulllString) do begin
if (FulllString[i] in ['à'..'ÿ']) or (FulllString[i] in ['À'..'ß']) or (FulllString[i]=' ') then Result:=Result+FulllString[i];
end;


AV   (2012-07-20 11:29:00) [10]


> Эти строки шаблоны, епана

:)
а кто это?
в "арм зарплата" работает?

вариант
const
 RB: set of Char = (['А'..'Я']);
 rs: set of Char = (['а'..'я']);
 Dig: set of Char = (['0'..'9']);

 function Parse(const S: string): string;
 var
   s2, s3: string;
   i: Integer;
   InS, InE: Integer;
   b: Boolean;
 begin
   s2 := s;
   b := False;

   repeat
     InS := Pos('(', s2);
     InE := Pos(')', s2);
     if (InS > 0)
        and (InE > 0)
        and (InS < InE) then
      Delete(s2, InS, InE) else
      b:= True;
   until b;

   for i := 0 to Length(s2) do
    if (s2[i] in RB)
        or (s2[i] in rs)
        or (s2[i] in Dig)
        or (s2[i] = ' ') then
     s3 := s3 + s2[i];

   repeat
     s3 := StringReplace(s3, '  ', ' ', [rfReplaceAll]);
   until Pos('  ', s3) = 0;
   Result := s3;
 end;


Wadimka   (2012-07-20 10:42:00) [11]

запятую тож нафиг после 1 сезон


Wadimka   (2012-07-20 10:41:00) [12]

вот реальная строка

Женщины и смерть / Women's Murder Club - 1 сезон, 13 серия (13)

нужно сделать так:

Женщины и смерть 1 сезон, 13 серия


Wadimka   (2012-07-20 10:39:00) [13]

Эти строки шаблоны, епана
но так они выглядят


Юрий Зотов   (2012-07-20 08:52:00) [14]


> Wadimka   (20.07.12 06:36) [4]

Если это действительно реальные строки, то все просто. Что-то вроде этого:

function Translate(Src: string): string;
const
 EnglishChars = ['A'..'Z', 'a'..'z', ' ', '0'..'9', ':'];
var
 i, j: integer;
 Bracket: string;
begin
 i := Pos(' / ', Src);
 if i = 0 then
   i := Pos(' - ', Src);
 if i = 0 then
   raise ESyntaxError.Create('Не найден ограничитель русского текста');
 Result := Copy(Src, 1, i);
 Result := StringReplace(Result, ':', '', [rfReplaceAll]);
 Inc(i, 3);
 if not (Src[i] in EnglishChars) then
   raise ESyntaxError.Create('Не найдено начало английского текста');
 while (i <= Length(Src)) and (Src[i] in EnglishChars) do
   Inc(i);
 if i > Length(Src) then
   raise ESyntaxError.Create('Не найдено начало первой части данных');
 if Src[i] = '(' then
 begin
   Bracket := ') ';
   Inc(i)
 end
 else
   Bracket := ' (';
 j := PosEx(Bracket, Src, i);
 if j = 0 then
   raise ESyntaxError.Create('Не найден ограничитель первой части данных');
 Result := Result + Copy(Src, i, j - i) + ' (';
 Inc(j, 2);
 if j > Length(Src) then
   raise ESyntaxError.Create('Не найдено начало второй части данных');
 Result := Result + Copy(Src, j, Length(Src));
 if Result[Length(Result)] <> ')' then
   Result := Result + ')'
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
 Memo1.Lines.Add('------');
 for i := 0 to Memo1.Lines.Count - 2 do
   Memo1.Lines.Add(Translate(Memo1.Lines[i]))
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Memo1.Clear;
 Memo1.Lines.Add('Строка по: русски / line 98 in: English (данные 1) данные 2');
 Memo1.Lines.Add('Строка по русски / line in: 17 English данные 2 (данные 1)')
end;

Но что-то мне подсказывает, что эти строки не совсем реальные. Если это так, то для решения задачи сначала надо ответить на вопросы:

- может ли русский текст содержать в себе символы / и - ;
- какие символы может содержать в себе английский текст;
- могут ли данные содержать в себе круглые скобки.


AV   (2012-07-20 08:45:00) [15]

ну а так просто вроде
1. удалить все от якоря до последнего символа английского алфавита
2. удалить запрещенные символы


AV   (2012-07-20 08:41:00) [16]


>  по русски до символа / оставить, потом

противоречит

Строка по: русски / line 98 in: English (данные 1) данные
- > Строка по русски данные 1 (данные 2)

должно быть
Строка по: русски  (данные 1) данные


Wadimka   (2012-07-20 06:36:00) [17]

Это реальный набор строк


Wadimka   (2012-07-20 06:35:00) [18]

Строка по: русски / line 98 in: English (данные 1) данные 2
Строка по русски / line in: 17 English данные 2 (данные 1)

вот и мозг пухнет


Германн   (2012-07-20 02:21:00) [19]


> шота не догоню нихрена

Приведи/дай реальный набор строк в виде файла.
P.S.
"Строка по: русски / line 98 in: English (данные 1) данные 2" - от такого примера мозг распухает вплоть до взрыва.


Юрий Зотов   (2012-07-20 00:26:00) [20]

Данные могут содержать латинские буквы или нет?


Наверх

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