Red4u.ru

SEO Сервисы и программы
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Delphi trim функция

Как обрезать любой символ (или подстроку) из строки?

4 horgh [2012-11-21 07:39:00]

Я использую С# в принципе. Там я могу сделать:

чтобы обрезать табуляцию из строки str и вернуть результат в trimmed .

В delphi7 я нашел только Trim , который сокращает пробелы.

Как я могу достичь той же функциональности?

trim delphi delphi-7

6 ответов

5 Решение Maksee [2012-11-21 08:11:00]

Это своего рода процедура, которую иногда легче создать, чем найти, где она живет:)

8 vladon [2014-11-05 14:29:00]

Существует вспомогательный параметр TStringHelper.Trim, который принимает массив Char как необязательный параметр.

Итак, вы можете использовать

для вашего примера. #09 здесь есть код ASCII для символа Tab.

Эта функция существует, поскольку по крайней мере Delphi XE3.

Надеюсь, что это поможет.

3 gordy [2012-11-21 08:20:00]

В Delphi функция Trim не принимает параметры, но выполняет обрезку других символов, а также пробелов. Вот код (из System.SysUtils в XE2, я не думаю, что он изменился):

Он обрезает что-нибудь меньшее, чем », которое устраняет любые управляющие символы, такие как вкладка, возврат каретки и фид строки.

Delphi не предоставляет функцию, которая делает то, что вы хотите. Встроенная функция Trim всегда обрезает один и тот же набор символов (пробелы и управляющие символы) с обоих концов входной строки. Несколько ответов здесь показывают базовый метод обрезки произвольных символов. Как вы можете видеть, это не должно быть сложно. Здесь моя версия:

Чтобы адаптировать это для обрезки нескольких символов, все, что вам нужно сделать, это изменить второй условный термин в каждом цикле. То, что вы меняете, зависит от того, как вы выбираете представление нескольких символов. С# использует массив. Вы также можете поместить все символы в строку, или вы можете использовать собственный тип набора Delphi.

Функции CharInArray и CharInString легко записать:

Вспомним, что с Delphi 2009 Char является псевдонимом для WideChar , что означает, что он слишком велик, чтобы вписаться в набор, поэтому вы не сможете использовать установленную версию, если только вам не гарантировано, что вход будет всегда вписывается в AnsiChar . Кроме того, синтаксис s[x] in c генерирует предупреждения по аргументам WideChar , поэтому вместо этого вы должны использовать CharInSet(s[x], c) . (В отличие от CharInArray и CharInString , RTL предоставляет CharInSet уже для версий Delphi, которые в этом нуждаются.)

Вы можете использовать StringReplace:

Отключает все символы Tab из заданной строки. Но вы можете улучшить его, если хотите удалить ведущие и завершающие вкладки, вы также можете использовать функцию Pos.

Edit: Для комментария, спрашивающего, как это сделать с Pos, вот он:

Это, конечно, тот же подход Максея и немного больше работы, чем он. Но если у вас не так много времени для завершения работы, и если Pos — это то, что вы думали в первую очередь, тогда это можно сделать. Вы, программист должны и , должны думать об оптимизации, а не мне. И если мы говорим об ограничениях оптимизации, с небольшим подстройкой, чтобы заменить Pos с помощью char, это будет работать быстрее, чем код Максея.

Изменить для обобщения поиска Substr:

JEDI JCL v2.7 предоставляет эти полезные функции для того, что вам нужно:

function StrTrimCharLeft(const S: string; C: Char): string; function StrTrimCharsLeft(const S: string; const Chars: TCharValidator): string; overload; function StrTrimCharsLeft(const S: string; const Chars: array of Char): string; overload; function StrTrimCharRight(const S: string; C: Char): string; function StrTrimCharsRight(const S: string; const Chars: TCharValidator): string; overload; function StrTrimCharsRight(const S: string; const Chars: array of Char): string; overload; function StrTrimQuotes(const S: string): string;

Читайте так же:
Функции работы со строками delphi

Урок №12. Работа со строками в Delphi — Delphi

Работа со строками Delphi позволяет извлечь из строки необходимую информацию и представить её в нужном виде. Система предоставляет весь спектр необходимых функций для работы со строками Delphi и преобразования строк Delphi в необходимые форматы:

  • числовой формат, целый и дробный с плавающей точкой;
  • формат времени, даты, даты-времени;
  • преобразование символов к верхнему или нижнему регистру;
  • сравнение строк, поиск в строке и копирование подстроки;
    и многие другие.

Непосредственно сами строки Delphi поддерживают единственную операцию, так называемую операцию конкатенации , то есть присоединения. Несмотря на «научное» название, операция конкатенации выполняет очень простую процедуру. С помощью операции конкатенации одна строка присоединяется к другой:

var S, S1, S2: String ;
begin
S:=S1+S2;
end ;

Результирующая строка S будет суммой двух слагаемых строк. Длина строки , то есть количество символов в строке, возвращается встроенной функцией

function Length(S: String ): Integer;

Delphi работает со строками типа String , в котором длина строки записывается в начале строки, перед первым символом. Поэтому индекс первого символа в строке не 0, а 1. То есть, если:

S:= ‘Строка типа String’ ;

то S[1] — символ ‘С’ , S[2] — символ ‘т’ , последний символ в строке — S[Length(S)], равный ‘g’ . — S[Length(S)], равный ‘g’ .

Однако часто приходится иметь дело со строками типа PChar, которые использует операционая система Windows. В строках типа PChar длина строки определяется специальным символом конца строки — #0 . Поэтому для использования функций Windows тип String необходимо предварительно переводить в тип PChar. Преобразование типа String в тип PChar выполняет функция

function PChar(S: String ): PChar;

Для полноценной работы со строками Delphi используются следующие стандартные процедуры и функции:

Функции преобразования в числовой формат и обратно

Выполняя вычисления, используем для ввода данных и отображения результатов следующие функции, работающие со строками Delphi:

Процедуры и функции преобразования дат и времени

Сначала собственно функции, предоставляющие информацию о текущих дате и времени:

Далее, функции, работающие с составляющими даты и времени (год, месяц, число, день недели, часы, минуты, секунды и даже миллисекунды):

Наконец, собственно, функции, переводящие дату и время из формата TDateTime в строчный формат:

Следующие функции работают с параметрами возвращаемой строки. Функции с приставкой Ansi работают в том числе и с кириллическими символами . Если символы в строках предполагаются исключительно латинские , то можно использовать аналогичные функции, но без приставки Ansi:

Следующие функции сравнивают две строки между собой:

Следующие функции осуществляют поиск в текущей строке подстроки, вставляют, удаляют или заменяют подстроку:

Наконец, функция копирования части строки:

Помимо прочего, эту функцию можно использовать для вывода нецелого числа с нужным количеством цифр после запятой. Для этого, сначала получаем строку из числа формата Real , затем находим функцией Pos позицию запятой в этой строке, прибавляем нужное количество и копируем в результат это количество символов. Вот готовая функция:

function RealToStr(X: Real; Count: Integer): String ; //Count — количество цифр после запятой
var S: String;
N: Integer;
begin
S:=FloatToStr(X); //после запятой — длинная последовательность цифр
N:=Pos(‘,’, S); //позиция запятой в строке
N:=N+Count; //вычисляем длину строки с нужным количеством знаков после запятой
Result:=Copy(S, 1, N);
end ;

Читайте так же:
Выберите единицы являющиеся в си основными

В комментариях Андрей предложил поправку в этой функции. Дело в том, что разделитель целой и дробной частей на разных компьютерах может быть и ‘,‘ и ‘.‘ — зависит от локальных настроек.

Для учёта этого в Delphi существует встроенная константа DecimalSeparator типа Char , принимающая значение символа-разделителя целой и дробной частей. Соответственно, оператор

N:=Pos( ‘,’ , S); //позиция запятой в строке

будет выглядеть так:

N:=Pos(DecimalSeparator, S);

Урок №12. Работа со строками в Delphi — Delphi

Работа со строками Delphi позволяет извлечь из строки необходимую информацию и представить её в нужном виде. Система предоставляет весь спектр необходимых функций для работы со строками Delphi и преобразования строк Delphi в необходимые форматы:

  • числовой формат, целый и дробный с плавающей точкой;
  • формат времени, даты, даты-времени;
  • преобразование символов к верхнему или нижнему регистру;
  • сравнение строк, поиск в строке и копирование подстроки;
    и многие другие.

Непосредственно сами строки Delphi поддерживают единственную операцию, так называемую операцию конкатенации , то есть присоединения. Несмотря на «научное» название, операция конкатенации выполняет очень простую процедуру. С помощью операции конкатенации одна строка присоединяется к другой:

var S, S1, S2: String ;
begin
S:=S1+S2;
end ;

Результирующая строка S будет суммой двух слагаемых строк. Длина строки , то есть количество символов в строке, возвращается встроенной функцией

function Length(S: String ): Integer;

Delphi работает со строками типа String , в котором длина строки записывается в начале строки, перед первым символом. Поэтому индекс первого символа в строке не 0, а 1. То есть, если:

S:= ‘Строка типа String’ ;

то S[1] — символ ‘С’ , S[2] — символ ‘т’ , последний символ в строке — S[Length(S)], равный ‘g’ . — S[Length(S)], равный ‘g’ .

Однако часто приходится иметь дело со строками типа PChar, которые использует операционая система Windows. В строках типа PChar длина строки определяется специальным символом конца строки — #0 . Поэтому для использования функций Windows тип String необходимо предварительно переводить в тип PChar. Преобразование типа String в тип PChar выполняет функция

function PChar(S: String ): PChar;

Для полноценной работы со строками Delphi используются следующие стандартные процедуры и функции:

Функции преобразования в числовой формат и обратно

Выполняя вычисления, используем для ввода данных и отображения результатов следующие функции, работающие со строками Delphi:

Процедуры и функции преобразования дат и времени

Сначала собственно функции, предоставляющие информацию о текущих дате и времени:

Далее, функции, работающие с составляющими даты и времени (год, месяц, число, день недели, часы, минуты, секунды и даже миллисекунды):

Наконец, собственно, функции, переводящие дату и время из формата TDateTime в строчный формат:

Следующие функции работают с параметрами возвращаемой строки. Функции с приставкой Ansi работают в том числе и с кириллическими символами . Если символы в строках предполагаются исключительно латинские , то можно использовать аналогичные функции, но без приставки Ansi:

Следующие функции сравнивают две строки между собой:

Следующие функции осуществляют поиск в текущей строке подстроки, вставляют, удаляют или заменяют подстроку:

Наконец, функция копирования части строки:

Помимо прочего, эту функцию можно использовать для вывода нецелого числа с нужным количеством цифр после запятой. Для этого, сначала получаем строку из числа формата Real , затем находим функцией Pos позицию запятой в этой строке, прибавляем нужное количество и копируем в результат это количество символов. Вот готовая функция:

Читайте так же:
Ассемблер для пик

function RealToStr(X: Real; Count: Integer): String ; //Count — количество цифр после запятой
var S: String;
N: Integer;
begin
S:=FloatToStr(X); //после запятой — длинная последовательность цифр
N:=Pos(‘,’, S); //позиция запятой в строке
N:=N+Count; //вычисляем длину строки с нужным количеством знаков после запятой
Result:=Copy(S, 1, N);
end ;

В комментариях Андрей предложил поправку в этой функции. Дело в том, что разделитель целой и дробной частей на разных компьютерах может быть и ‘,‘ и ‘.‘ — зависит от локальных настроек.

Для учёта этого в Delphi существует встроенная константа DecimalSeparator типа Char , принимающая значение символа-разделителя целой и дробной частей. Соответственно, оператор

N:=Pos( ‘,’ , S); //позиция запятой в строке

будет выглядеть так:

N:=Pos(DecimalSeparator, S);

Работа с регулярными выражениями в Delphi

Механизм обработки регулярных выражений находится в модуле System.RegularExpressions и состоит из одного класса и двух записей (не считая служебных компонентов).

  • TRegEx – (класс) собственно обработка регулярного выражения;
  • TMatch – (запись) представление единичного результата обработки;
  • TMatchCollection – (запись) коллекция результатов обработки (TMatch). Используется, если предполагается, что в тексте может быть несколько фрагментов соответствующих данному регулярному выражению.
Создание объекта для обработки регулярного выражения

Допустим, есть простенькое регулярное выражение для проверки адреса сайта расположенного на домене второго уровня.

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

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

После того как объект для обработки регулярного выражения создан можно перейти к решению прикладных задач. Например, поиску соответствий или замене фрагментов текста.

Поиск соответствий

Поиск единичного совпадения осуществляется достаточно просто.

Для этого требуется передать анализируемую строку в качестве параметра метода Match, и он вернёт значение типа TMatch, если в ней имеется соответствие. При этом найденный текст будет доступен через поле Value TMatch.

Если соответствий в тексте может быть несколько, то способ реализации зависит от конкретной задачи.

Если требуется просто найти самое первое (от начала строки) соответствие, можно также воспользоваться методом Match. Он корректно отработает и при наличии нескольких соответствий, но возвратит только самое первое из них. В противном случае следует использовать метод Matches и работать с TMatchCollection,

Вызов метода Matches аналогичен методу Match.

Каждое найденное соответствие будет доступно в качестве элемента коллекции (TMatch) TMatchCollection.

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

Для этого служит метод IsMatch класса TRegEx. В случае наличия в анализируемой строке хотя бы одного соответствия регулярному выражению данный метод возвратит true. Также как и в предыдущих случаях, анализируемая строка передаётся в качестве параметра.

Замена фрагментов текста по регулярному выражению

Для замены фрагментов текста по регулярному выражению служит метод Replase класса TRegEx. Он принимает два строковых аргумента: анализируемую строку и строку, на которую будут заменены все соответствия данному регулярному выражению.

В примере ниже все найденные в исходной строке адреса сайтов на домене второго уровня будут заменены текстом « ».

Читайте так же:
Php directory separator
Разделение строк по регулярному выражению

Класс TRegEx поддерживает разделение строки с использованием регулярного выражения для поиска мест разделения.

Разделение осуществляется при помощи метода Split, который имеет несколько перегрузок. Наиболее простая из них принимает в качестве параметра только анализируемую строку. Данный метод возвращает массив разделённых строк в формате TArray .

Однако работа этого метода имеет одну особенность. Он не всегда корректно обрабатывает пробелы и управляющие символы. Поэтому перед дальнейшим использованием строк, полученных в результате, может потребоваться удаление лишних символов при помощи функции Trim.

Ниже приведён пример разделения строк по регулярному выражению с использованием функции Trim.

DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники

Процедуры и функции для работы со строками в Delphi

Строки очень часто используются в программах — хотя бы для вывода раз­личных сообщений пользователю, чтобы он не заблудился в интерфейсе. Ну, для таких простых случаев вполне достаточно тех сведений, которые вы получили на уроке, посвящённом строкам. Если же у вас более серьёз­ные намерения и вы хотите манипулировать строками по своему желанию (например, вы пишете какую-нибудь словесную игру вроде Балды или Ло­гогрифов), то в Delphi найдётся всё нужное и для таких любителей словес­ности и жонглирования приставками и суффиксами.

Для определённости в примерах будем считать, что

Когда мы изучали простые операции со строками, то рассматривали кон­катенацию строк с помощью оператора +. Но объединить две строки можно и функцией

которая возвращает «сумму» двух строк:

Для сравнения строк вместо операторов отношения можно использовать следующие функции.

Обе функции сравнивают строки s1 и s2. Первая — с учётом регистра букв (прописные/строчные), вторая — без учёта.

Эти функции возвращают значение

0, если строки равны;

Их нельзя применять к русским словам, поэтому лучше пользоваться функциями:

которые одинаково хорошо работают и с латинскими, и с русскими буква­ми.

Теперь перейдём к процедурам и функциям, которые выполняют со сло­вами более сложные действия.

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

Первая переводит слова в нижний регистр (строчные буквы), вторая — в верхний (прописные буквы). Для русских ( и для латинских ) букв годятся функции :

Функция AnsiLowerCase (S1) вернёт строку «смородина».

Функция AnsiUpperCase (’смородина’) вернёт строку «СМОРОДИНА».

Процедуры вывода сообщений на экран (обычно в метку или список) тре­буют в качестве параметра строку, а что делать, если нужно предъявить пользователю число? — Преобразовать число в строку! Это можно сде­лать и самостоятельно, но гораздо удобнее воспользоваться встроенными функциями Delphi.

Чаще других в программах применяют функции для преобразования це­лых чисел в строку:

Например, IntToStr (1234) вернёт строку «1234».

Для действительных чисел тоже имеется подобная функция

Если вы хотите узнать, как десятичное число записывается в 16-ричной системе счисления, примените к нему функции:

Например, IntToHex (12 34, 8) вернёт строку «000004D2», а IntToHex (2009, 4) — строку «07D9».

Второй параметр — Digits — задаёт число цифр в 16-ричном числе.

При вводе данных из файла или некоторых компонентов вместо числа мы получаем строку символов. И хотя она состоит из цифр, это не число. В этом случае поможет функция

Причём строка S может содержать не только десятичное, но и 16-ричное число.

Читайте так же:
Как объединить ячейки в css

Например, функции StrToInt(’$07D9’) и StrToInt(’2009’) вернут одно и то же число 2009.

Однако эта функция «опасна»: если в строке обнаружится хотя бы один неверный символ, возникнет ошибка. Если у вас есть обоснованные со­мнения в правильности строки, лучше обратиться к надёжной функции

Она возвращает TRUE, если строка преобразована в число без ошибок, и FALSE, если с ошибками. Переменная Value (в нашем примере i) хранит число.

В примере строка ‘$07D9s’ содержит неверный символ «s», поэтому функ­ция вернёт FALSE и строку печатать не нужно (на самом деле значение переменной i будет равно 2009, так как функция успеет конвертировать первые символы строки — до первой «нецифры»).

Так же можно использовать и процедуру:

V — переменная целого или действительного типа.

Code — переменная целого типа, в которой возвращается номер ошибочно­го символа в строке. Если таких символов нет, то значение этой перемен­ной будет равно нулю.

В результате выполнения этого примера будет напечатано число 2009.

Этот код также напечатает число 2009, но значение переменной i будет равно не нулю, как в первом случае, а 6, так как шестой символ строки не является 16-ричной цифрой.

Аналогичные функции для вещественных чисел:

В начале и/или конце строки могут присутствовать ненужные пробелы. От них легко избавиться , применив функции

Первая удаляет начальные пробелы, вторая — конечные, третья — и те, и другие. Эти функции возвращают новую строку — уже без пробелов.

Узнать длину строки (число символов в ней) можно с помощью функции

Например , Length (S1) вернёт 9, а Length(S2) — 7.

Ну, а теперь — самые интересные процедуры и функции!

Удаляем часть строки S от символа номер Index:

Здесь Count — число удаляемых символов.

Например, после выполнения процедуры:

строка si будет иметь значение «РОДИНА».

А после процедуры delete(s2,5,3); строка s2 будет урезана до «ПАРА».

Если значение переменной Index меньше единицы или больше длины строки, то строка останется без изменений. Ничего не слу­чится со строкой и если Count меньше единицы.

Если же Count больше, чем число символов в строке, начиная с In­dex, то будут удалены все символы до конца строки.

Процедура Insert действует противоположно — она вставляет подстроку Substr в строку Dest после символа номер Index:

Например, после выполнения процедуры insert (’З’, s1,6); строка s1 превратится в смешное слово «СМОРОЗДИНА».

А процедура insert (’КА’, s2,8); позволит нам насладиться неологиз­неологиз­мом «ПАРАШЮТКА».

Если же мы не хотим портить исходную строку, как это делает процедура Delete, то можем создать новую строку, вырезав из любой строки нужный нам кусок:

Например, строка s примет значение «ПАРА» после выполнения функции s:=copy(s2,1,4);

Обратите внимание: чтобы получить то же самое слово, что и в примере с delete(s2,5,3);, мы указали другие значение параметров в вызове функции!

Функция copy (s1,4,9) вернёт в переменную s слово «РОДИНА».

И последняя функция находит позицию подстроки substr в строке str. function Pos(const substr: string; const str: string): Integer;

Если в строке искомая подстрока встречается несколько раз, то первый вызов функции Pos вернёт позицию первого вхождения, после чего поиск нужно продолжить со следующей позиции. Например, в слове ФЕЛЬДФЕБЕЛЬ так можно найти обе «ели».

Если же подстроки в строке нет, то вернётся безнадёжный ноль!

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector