извлечение первой строки из текстового абзаца в delphi - PullRequest
1 голос
/ 15 июля 2010

У меня есть текст, передаваемый в функцию. Этот текст может содержать что угодно, от одного символа до полной книги.

Мне нужно извлечь первый лайк и использовать его в качестве «заголовка», чтобы я мог назвать файл, в котором я сохраняю этот текст как резервную копию. Я использую следующее:

function GetTitle(var Text:string):string;
var
  title: string;
  position: integer;
begin
    title := '';
    position := AnsiPos(#10, Text);

    if position = 0 then
    begin
      position := AnsiPos('.', Text);
      if (position = 0) then
         title := Text
      else
         title := copy(Text, 1, position);
    end
    else
    begin
        title := copy(Text, 1, position);
    end;

    result := title;
end;

Я проверяю № 10, а не № 13, потому что текст может быть передан либо из приложения Windows, либо из приложения Mac OS X. В тех случаях, когда №10 нет, я проверяю 1-й. (точка), и если их нет, я передаю все это как заголовок.
Этот подход вызывает некоторые проблемы с именами файлов, содержащими # 13 в имени или имена слишком длинные. Я могу добавить чек на> 256 для заголовка, но это просто другая вещь.

В любом случае, есть ли способ правильно прочитать первую строку (включая # 13 # 10 или # 10 или # 13 или. Или что-то еще)?

Я знаю, что это просто, но я не могу найти способ справиться с этим, не вложив ifs ...

код приветствуется. спасибо

Ответы [ 5 ]

3 голосов
/ 15 июля 2010

То, что вы делаете, звучит как максимум, что вы можете сделать, учитывая произвольный характер вашего ввода, но этого будет недостаточно, потому что нет гарантии, что первое предложение в вашем произвольном тексте будет достаточно коротким, чтобы быть заглавие. Вам нужно добавить шаг для усечения текста, если он длиннее некоторого произвольного предела длины, и добавить многоточие (три точки ...), чтобы указать, что текста больше.

3 голосов
/ 15 июля 2010

хммм, этот работает:

function TForm1.SimpleNoteGetTitle(Text:string):string;
var
  position: integer;
begin
    position := AnsiPos(#13#10, Text);
    if (position = 0) or (position > 50) then position := AnsiPos(#10, Text);
    if (position = 0) or (position > 50) then position := AnsiPos(#13, Text);
    if (position = 0) or (position > 50) then position := AnsiPos('.', Text);
    if (position = 0) or (position > 50) then position := AnsiPos(',', Text);
    if (position = 0) or (position > 50) then position := AnsiPos(';', Text);
    if (position = 0) or (position > 50) then position := AnsiPos('?', Text);
    if (position = 0) or (position > 50) then position := AnsiPos('!', Text);
    if (position = 0) or (position > 50) then position := AnsiPos(' ', Text);

    if position = 0 then
       result := Text
    else
       result := copy(Text, 1, position - 1);
end;

ОБНОВЛЕННАЯ версия функции

2 голосов
/ 16 июля 2010

Я бы решил проблему с помощью цикла, возможно, немного быстрее, чем несколько вызовов Pos.

function GetTitle(const Text:string):string; 
var 
  I: integer;
begin 
  I := 0;
  while I < Length(Text) do
  begin
    if (Text[I+1] in [#10,#13,'.']) then
      Break;
    Inc(I);
  end;
  Result := Copy(Text,1,I);
end; 
2 голосов
/ 15 июля 2010

Возможно, это не лучший способ, но он устраняет вложенные if ...

function GetTitle(var Text:string):string; 
var 
  position1: integer; 
  position2: integer; 
  position3: integer; 
  position: integer; 
begin 

    Text := copy(Text,0,255);

    position1 := AnsiPos(#10, Text); 
    position2 := AnsiPos(#13, Text); 
    position3 := AnsiPos('.', Text); 

    if position1 = 0 then position1 := 255;
    if position2 = 0 then position2 := 255;
    if position3 = 0 then position3 := 255;

    position := Min(Min(position1,position2),position3);

    result := copy(Text, 1, position); 

end; 
0 голосов
/ 18 июля 2010

Почему бы не извлечь до (скажем) 10 слов из начала строки, игнорируя при этом недопустимые символы файла, такие как CR, LF,:.и т.д., если они существуют.

и сделать это название?

более сложным, но наверняка создаст допустимое имя файла

просто мысль:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...