Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.233.72] |
|
Сообщ.
#1
,
|
|
|
В Syste.Classes есть функция ExtractStrings, она разбивает слова из текста, учитывает сепараторы и достаточно быстрая.
Но есть в ней ряд проблем: К примеру текст: Yo 'dude' I'm big 'man' of 'steal' n1 Разбивается на слова: Цитата Yo 'dude' I'm big 'man' of 'steal' n1 А дожен разбиваться на: Цитата Yo 'dude' I'm big 'man' of 'steal' n1 .... ExtractStrings([ ',','.',' '],[], Pchar(Memo1.Text), Memo2.Lines); .... function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings): Integer; var Head, Tail: PChar; EOS, InQuote: Boolean; QuoteChar: Char; Item: string; begin Result := 0; if (Content = nil) or (Content^ = #0) or (Strings = nil) then Exit; Tail := Content; InQuote := False; QuoteChar := #0; Strings.BeginUpdate; try Include(WhiteSpace, #13); Include(WhiteSpace, #10); Include(Separators, #0); Include(Separators, #13); Include(Separators, #10); Include(Separators, ''''); Include(Separators, '"'); repeat while (Tail^ in WhiteSpace) do Inc(Tail); Head := Tail; while True do begin while (InQuote and not ((Tail^ = #0) or (Tail^ = QuoteChar))) or not (Tail^ in Separators) do Inc(Tail); if (Tail^ in ['''', '"']) then begin if (QuoteChar <> #0) and (QuoteChar = Tail^) then QuoteChar := #0 else if QuoteChar = #0 then QuoteChar := Tail^; InQuote := QuoteChar <> #0; Inc(Tail); end else Break; end; EOS := Tail^ = #0; if (Head <> Tail) and (Head^ <> #0) then begin if Strings <> nil then begin SetString(Item, Head, Tail - Head); Strings.Add(Item); end; Inc(Result); end; Inc(Tail); until EOS; finally Strings.EndUpdate; end; end; Буду признателен за помощь в решении моей задачи. |
Сообщ.
#2
,
|
|
|
Надо всего лишь убрать кавычку и двойную кавычку из особых символов; считать их типичными 'буквами'.
|
Сообщ.
#3
,
|
|
|
Славян
пасиба! |