Форум: "Начинающим";
Текущий архив: 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 ["à".."ÿ"]) or (FulllString[i] in ["À".."ß"]) 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.055 c