![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите сделать персер строки
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]Данные могут содержать латинские буквы или нет?