Delphi XE, используя собственный модуль регулярных выражений Delphi.Неожиданное поведение RegEx в Delphi XE
Я пытаюсь исправить какой-то плохой RTF-код, где теги «закладки» пересекают границы ячейки таблицы. Кажется достаточно простым. Код, который я использую, приведен ниже. Вот общая идея.
Учитывая этот текст
{\*\bkmkstart BM0}\plain\f0\fs24\cf0 ^\cell}
Посмотрите на матч к этой модели (должно быть ровно один в данном тексте):
{\\\*\\bkmkstart BM0}\\plain\\f[0-9]\\fs[0-9]+\\cf[0-9] \^\\cell}
Когда, замените его с этим (не RegEx):
{\*\bkmkstart BM0}\plain\f0\fs24\cf0 ^{\*\bkmkend BM0}\plain\f0\fs24\cf0 \cell}
Ожидаемые результаты: первая строка должна быть заменена на la й строки, например:
{\*\bkmkstart BM0}\plain\f0\fs24\cf0 ^\cell} *becomes*
{\*\bkmkstart BM0}\plain\f0\fs24\cf0 ^{\*\bkmkend BM0}\plain\f0\fs24\cf0 \cell}
Однако, результат на самом деле я получаю это:
{\*\bkmkstart BM0}\plain{\*\bkmkstart bm0}\plain\f0\fs24\cf0 ^\cell}\fs24\cf0 ^{\*\bkmkend BM0}\plain{\*\bkmkstart bm0}\plain\f0\fs24\cf0 ^\cell}\fs24\cf0 \cell}
Это выглядит так, как если RegEx анализатор становится ужасно запутался как-то, но я не могу даже характеризуют то, что происходит. Это не просто двойная замена, а вставка вместо замены. Однако строка 'ReplaceWith' кажется источником путаницы. Если я использую хороший простой «XXXX» для строки ReplaceWith, вместо RTF, он работает точно так, как должен.
Итак, любые идеи о том, как/почему поиск и замена RegEx здесь так странно ломаются?
Вот код, я использую:
procedure TfrmMain.btnProcessClick(Sender: TObject);
const
SourceString = '{\*\bkmkstart BM0}\plain\f0\fs24\cf0 ^\cell}';
RegExFind = '{\\\*\\bkmkstart BM0}\\plain\\f[0-9]\\fs[0-9]+\\cf[0-9] \^\\cell}';
ReplaceWith = '{\*\bkmkstart BM0}\plain\f0\fs24\cf0 ^{\*\bkmkend BM0}\plain\f0\fs24\cf0 \cell}';
var
ResultStr: string;
MyRegEx: TRegEx;
begin
MyRegEx := TRegEx.Create (RegExFind);
ResultStr := MyRegEx.Replace (SourceString, ReplaceWith);
ShowMessage (ResultStr);
end;
Кроме того: я ненавижу Emba dev, который решил, что «TRegEx.Create» будет иметь смысл, учитывая, что «TRegEx» - это запись. –
Я предположил, что .create был сделан здесь, чтобы проиллюстрировать расширенные возможности записи, так что, например, я, как я, мог бы дать ему завихрение. –
Это становится захватывающим, когда вы pas 'MyRegEx'' FreeAndNil' ..... –