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

Вниз

Помогите сделать персер строки   Найти похожие ветки 

 
Wadimka   (2012-07-19 23:23) [0]

Есть строка

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

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

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

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

пишу на delphi 7


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

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


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


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

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


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

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

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


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

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


 
AV ©   (2012-07-20 08:41) [5]


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

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

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

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


 
AV ©   (2012-07-20 08:45) [6]

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


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


> 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;

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

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


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

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


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

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

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

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

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


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

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


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


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

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

вариант
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 11:57) [12]

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

for i:=1 to Length(FulllString) do begin
if (FulllString[i] in ["&#224;".."&#255;"]) or (FulllString[i] in ["&#192;".."&#223;"]) or (FulllString[i]=" ") then Result:=Result+FulllString[i];
end;


 
Inovet ©   (2012-07-20 12:17) [13]

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

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


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

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


 
AV ©   (2012-07-20 12:30) [15]


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

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


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


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

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

Жду.


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

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


 
Inovet ©   (2012-07-20 22:21) [18]

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

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


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


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

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

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

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


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


> > Wadimka  

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



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.152 c
15-1345753802
Юрий
2012-08-24 00:30
2013.03.22
С днем рождения ! 24 августа 2012 пятница


1-1295711313
Gu
2011-01-22 18:48
2013.03.22
Диалог "Свойства файла" для нескольких файлов папок


8-1230540711
inviz
2008-12-29 11:51
2013.03.22
Длинна avi файла (некоректно определяет)


6-1261756160
Kain
2009-12-25 18:49
2013.03.22
Реализация мультиплексирования


11-1244731932
Dy1
2009-06-11 18:52
2013.03.22
БД