Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вставка неразрывного пробела в документ Word / 7 сообщений из 7, страница 1 из 1
17.04.2018, 10:56
    #39631379
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка неразрывного пробела в документ Word
Добрый день. Подскажите, почему может не работать вставка спец. символов?
Я ищу в документе 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
17.04.2018, 11:31
    #39631413
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка неразрывного пробела в документ Word
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
17.04.2018, 11:42
    #39631421
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка неразрывного пробела в документ Word
ma1tus, а в методе Replace такое не пройдет
...
Рейтинг: 0 / 0
17.04.2018, 11:53
    #39631436
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка неразрывного пробела в документ Word
cptngrb,

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

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

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

? OK, похоже, правда не понимаю...
...
Рейтинг: 0 / 0
19.04.2018, 12:25
    #39633093
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка неразрывного пробела в документ Word
на сайте 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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вставка неразрывного пробела в документ Word / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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