powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / RegExpr, разбить строку на строки фиксированной длины исключая строки с [tag]...[/tag]
4 сообщений из 4, страница 1 из 1
RegExpr, разбить строку на строки фиксированной длины исключая строки с [tag]...[/tag]
    #39540776
PalychXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Buenas noches, señores!

Нужна ваша помощь по следующей проблеме. Имеется строка с возвратами каретки и конструкциями [tag type="1"]some text[/tag]. Нужно разбить ее на подстроки таким образом, чтобы ширина обычного текста не превышала указанного в параметре значения, но при этом чтобы функция поместила конструкции с тегами [tag type="1"]some text[/tag] в отдельные строки (если это еще не так), но не переносила ничего внутри конструкции.
Например:
Код: pascal
1.
2.
s := 'Это какой-то очень длинный текст со специальными вставками.'#13#10'Вот такими:[tag type="1"]Здесь ничего переносить не нужно[/tag]Конец';
s := Wrap(s, 20);


и на выходе:
Код: plaintext
1.
2.
3.
4.
5.
Это какой-то очень д
линный текст со спец
иальными вставками.
Вот такими:
[tag type="1"]Здесь ничего переносить не нужно[/tag]
Конец

Т.к. все равно нужно парсить такие конструкции, чтобы вытащить тип и текст внутри конструкций, хотел поинтересоваться, есть ли элегантное решение по переносу с помощью регулярок (используя Split или Replace). С регулярками раньше не было нужды сталкиваться, по парсингу "родил" примерно такое:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure TForm1.Button1Click(Sender: TObject);
const
  data = 'Первая строка [code type="1"]Блок 1

 Конец' + //#13#10 +
    'Вторая строка [code type="2"]Блок 2'#13#10'345[/ code] End' + #13#10 +
    'Третяя строка [code type="3"]Блок 3[/ code] The End';
var
  r: TRegExpr;
  s: string;
begin
  s := '';
  r := TRegExpr.Create;
  try // ensure memory release
     r.ModifierStr := 'i'; // регистронезависимый поиск
     r.Expression := '\[code[^"\]]{1,}type="([^"\]]{1,})"\]([^"\]]{0,})\[\/code]';
     if r.Exec(data)
      then s := r.Substitute('Type = $1, Value = "$2" (Pos=' + r.MatchPos[0].ToString + ', Len=' + IntToStr(r.MatchLen[0]) + ')');
     while r.ExecNext do s := s + #13#10 + r.Substitute('Type = $1, Value = "$2" (Pos=' + r.MatchPos[0].ToString + ', Len=' + IntToStr(r.MatchLen[0]) + ')');
  finally
    r.Free;
  end;
  ShowMessage(s);
end;


Как бы составить регулярку чтобы разбить Split"ом?
...
Рейтинг: 0 / 0
RegExpr, разбить строку на строки фиксированной длины исключая строки с [tag]...[/tag]
    #39540809
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не проще ли без RegExpr
...
Рейтинг: 0 / 0
RegExpr, разбить строку на строки фиксированной длины исключая строки с [tag]...[/tag]
    #39541145
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PalychXXпо переносу с помощью регулярок

Дело в том, что регулярные выражения - это кагбэ образцы поиска, шаблоны, а не функции и процедуры. Т.е. регулярные выражения предназначены для поиска текста, а не для манипуляции над ними.
...
Рейтинг: 0 / 0
RegExpr, разбить строку на строки фиксированной длины исключая строки с [tag]...[/tag]
    #39541176
PalychXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понял, спасибо, разбивку на строки сделал стандартными средствами. :)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / RegExpr, разбить строку на строки фиксированной длины исключая строки с [tag]...[/tag]
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]