2010-10-22 3 views
0

В php и java есть функция explode и tokenizer для преобразования строки в массив без пунктуации. Являются ли какие-либо функции или каким-то образом в delphi для выполнения работы. Предположим, что существует большой файл «Это большой файл с пунктуациями ,, пробелы и числа 123 ...» Как мы можем получить массив «Это большой файл с пунктуациями и пробелами и цифрами 123»Как преобразовать строку в массив в delphi?

Заранее большое спасибо.

Да, мы хотим только [0..9], [a..z], [A..Z], как \ w в регулярном выражении. Можем ли мы использовать regex в Tperlregex для извлечения \ w и поместить их в Tstringlist, как если бы tstringlist был массивом, но он может быть не столь эффективным? Спасибо.

+1

Возможно, вы захотите заметить, что строка, по сути, * представляет собой массив символов. –

+1

Основываясь на вашем примере, похоже, что вы просто хотите удалить запятые из строки. Не могли бы вы, например, изменить свой вопрос? –

+0

Спасибо, Андреас Реджбранд и Евгений Майевски – Dylan

ответ

4

Если вам нужна функция, которая принимает строку и возвращает массив строк, то эти строки являются подстроками оригинала, разделенного пунктуацией, так как Евгений предлагал в моем предыдущем ответе, то вы можете сделать

type 
    StringArray = array of string; 
    IntegerArray = array of integer; 
    TCharSet = set of char; 

function split(const str: string; const delims: TCharSet): StringArray; 
var 
    SepPos: IntegerArray; 
    i: Integer; 
begin 
    SetLength(SepPos, 1); 
    SepPos[0] := 0; 
    for i := 1 to length(str) do 
    if str[i] in delims then 
    begin 
     SetLength(SepPos, length(SepPos) + 1); 
     SepPos[high(SepPos)] := i; 
    end; 
    SetLength(SepPos, length(SepPos) + 1); 
    SepPos[high(SepPos)] := length(str) + 1; 
    SetLength(result, high(SepPos)); 
    for i := 0 to high(SepPos) - 1 do 
    result[i] := Trim(Copy(str, SepPos[i] + 1, SepPos[i+1] - SepPos[i] - 1)); 
end; 

Пример:

const 
    PUNCT = ['.', ',', ':', ';', '-', '!', '?']; 

procedure TForm4.FormCreate(Sender: TObject); 
var 
    str: string; 
begin 
    for str in split('this, is, a! test!', PUNCT) do 
    ListBox1.Items.Add(str) 
end; 
2

Это зависит от определения «буквенно-цифрового символа» и «символа укорачивания».

Если мы, например, определить набор символов пунктуации

const 
    PUNCT = ['.', ',', ':', ';', '-', '!', '?']; 

и рассмотрим все остальные символы буквенно-цифровой, то вы могли бы сделать

function RemovePunctuation(const Str: string): string; 
var 
    ActualLength: integer; 
    i: Integer; 
const 
    PUNCT = ['.', ',', ':', ';', '-', '!', '?']; 
begin 
    SetLength(result, length(Str)); 
    ActualLength := 0; 
    for i := 1 to length(Str) do 
    if not (Str[i] in PUNCT) then 
    begin 
     inc(ActualLength); 
     result[ActualLength] := Str[i]; 
    end; 
    SetLength(result, ActualLength); 
end; 

Эта функция преобразует строку в строку. Если вы хотите, чтобы превратить строку в массив символов вместо вобще

type 
    CharArray = array of char; 

function RemovePunctuation(const Str: string): CharArray; 
var 
    ActualLength: integer; 
    i: Integer; 
const 
    PUNCT = ['.', ',', ':', ';', '-', '!', '?']; 
begin 
    SetLength(result, length(Str)); 
    ActualLength := 0; 
    for i := 1 to length(Str) do 
    if not (Str[i] in PUNCT) then 
    begin 
     result[ActualLength] := Str[i]; 
     inc(ActualLength); 
    end; 
    SetLength(result, ActualLength); 
end; 

(Да, в Delphi, строки использовать индексацию 1 на основе, в то время как массивы используют 0-индексирование. Это по историческим причинам.)

+0

Я считаю, что OP нуждается в функции парсера, которая возьмет строку и создаст массив подстрок, извлеченных путем разделения на знаки препинания. –

+0

А, я вижу. (Но почему он так не сказал?) –

0

Кажется, нет встроенных функций, например, в токенизаторе Java. Давным-давно мы написали класс tokenizer, похожий на Java, который стал частью набора компонентов ElPack (теперь LMD ElPack). Вот некоторые implementation of string tokenizer, похожие на Java one (только что нашли эту ссылку в Google, поэтому я не могу прокомментировать качество кода).

Смежные вопросы