Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.073 c
3-1285656778
ABolnykh
2010-09-28 10:52
2013.03.22
Как предотвратить появление окна запроса пароля PasswordDialog?


15-1354048202
Юрий
2012-11-28 00:30
2013.03.22
С днем рождения ! 28 ноября 2012 среда


2-1334555099
Мишан
2012-04-16 09:44
2013.03.22
Вот так бывает


2-1338190785
jacksotnik
2012-05-28 11:39
2013.03.22
Удалить поле из пользовательского датасета


15-1337159093
Дмитрий С
2012-05-16 13:04
2013.03.22
Загрузить одним махом несколько динамических массивов.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский