powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вставка неразрывного пробела в документ Word
7 сообщений из 7, страница 1 из 1
Вставка неразрывного пробела в документ Word
    #39631379
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Подскажите, почему может не работать вставка спец. символов?
Я ищу в документе Word текст с помощью регулярных выражений и заменяю на то, что мне нужно.
Поиск и замена осуществляется следующим образом.
1. Беру текст параграфа
2. Прогоняю через TPerlRexExp
3. Если совпадение найдено, то заменяю.
В простом случае все работает как надо, но вот с спец. символами выходит затык, хотя в программе RegexBuddy все отрабатывает корректно.

код для примера

Код: 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.
25.
26.
var
  R: TPerlRegEx;
  start, stop: integer;
begin
    if AText = '' then exit;

    R:= TPerlRegEx.Create;
    R.Options := [preCaseLess];
    try
      R.RegEx := '(\d+)\s+тысяч';
      R.Subject := 'Вася пришел в школу и отдал 5 тысяч рублей'
      R.Replacement:= '\1\xA0тыс.'
      if R.Match then
      begin
        repeat
          start:= r.MatchedOffset - 1;
          stop:= start + R.MatchedLength;
          oWord.OleObject.Application.ActiveDocument.Range(start, stop).Select;  //выделели найденное место в тексте для внимания
          if Application.MessageBox('Найдено совпадение. Заменить?', 'Сообщение', MB_YESNO + MB_ICONQUESTION) = 6 then
          R.Replace; //заменить текст если согласны
        until not R.MatchAgain;
        AText:= R.Subject;
      end;
    finally
      FreeAndNil(R);
    end; 



должно замениться на 5 тыс. , а меняется на 5\xA0тыс.
Что я упускаю?
...
Рейтинг: 0 / 0
Вставка неразрывного пробела в документ Word
    #39631413
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var W, D: Variant;
    s: string;
begin
  W := CreateOleObject('Word.Application');
  W.Visible := True;
  D := W.Application.Documents.Add;
  s := 'a' + Chr(160) + 'b';
  W.Selection.Text := s;
end;
...
Рейтинг: 0 / 0
Вставка неразрывного пробела в документ Word
    #39631421
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ma1tus, а в методе Replace такое не пройдет
...
Рейтинг: 0 / 0
Вставка неразрывного пробела в документ Word
    #39631436
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Код: pascal
1.
R.Replacement:= '\1' + Chr(160) + 'тыс.';

не пройдёт или не проходит..?
...
Рейтинг: 0 / 0
Вставка неразрывного пробела в документ Word
    #39631462
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ma1tus, в данном примере работает, но не подойдет, так как на вход подается строка и что внутри я не знаю заранее. Получается, что мне нужно будет ее анализировать на кучу спец. символов и подставлять вместо стандартных выражений PerlRegexp
...
Рейтинг: 0 / 0
Вставка неразрывного пробела в документ Word
    #39631511
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

имеете в виду, что ваша R.RegEx должна стать сложнее для R.Subject навроде
Код: pascal
1.
#182'Вася'#160#167'при'#172'шел'#160'в'#160'школу'#217'и'#178'отдал'#173'5 тысяч'#160'рублей'#169

? OK, похоже, правда не понимаю...
...
Рейтинг: 0 / 0
Вставка неразрывного пробела в документ Word
    #39633093
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на сайте http://www.regular-expressions.info/pcre.html написано:
авторBy default, PCRE compiles without Unicode support. If you try to use \p, \P or \X in your regular expressions, PCRE will complain it was compiled without Unicode support.

To compile PCRE with Unicode support, you need to define the SUPPORT_UTF8 and SUPPORT_UCP conditional defines. If PCRE's configuration script works on your system, you can easily do this by running ./configure --enable-unicode-properties before running make. The regular expressions tutorial on this website assumes that you've compiled PCRE with these options and that all other options are set to their defaults.

В конструкторе проставляется только SUPPORT_UTF8 , а SUPPORT_UCP нет и в исходниках не используется нигде. Так что тем, кто хочет использовать СТАНДАРТНЫЕ возможности PCRE придется изгаляться.
Работа с русским текстом это ужас. Граница слова, слова ... только английский, и да, да все это описано в спецификациях, но Ъ.

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

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
R.Replacement:= ChangeCpecialCharacter(AReplace);


function ChangeCpecialCharacter(s: string): string;
var
  i, p: integer;
  ch: integer;
  j, str: string;
begin
  Result:= '';
  i:= 0;
  p:= pos('\x', s);
  if p > 0 then
  begin
    j:= copy(s, p+2, 2);
    ch:= StrToInt('$'+j);
    result:= result + copy(s, i, p-1) + chr(ch);
    i:= p;
    while p > 0 do
    begin
      p:= pos('\x', s, p+3);
      if p > 0 then
      begin
        j:= copy(s, p+2, 2);
        ch:= StrToInt('$'+j);
        str:= copy(s, i+4, (p-4)-(i+4));
        result:= result + str + chr(ch);
        i:= p;
      end;
    end;
    result:= result + copy(s, i+4, length(s)-i+4);
  end
  else
  Result:= s;
end; 
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вставка неразрывного пробела в документ Word
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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