当指定为替换时,为什么TPerlRegEx未正确处理回车换行(CR LF)

Joa*_*son 7 delphi

我尝试使用TPerlRegEx类用新行替换空格.

with RegExp do
begin
  Subject:=Memo1.Lines.Text;
  RegEx:=' ';
  Replacement:='\r\n';
  ReplaceAll;
  Memo1.Lines.Text:=Subject;
end;
Run Code Online (Sandbox Code Playgroud)

问题是它将\ r \n替换视为文字文本.

Cos*_*und 8

使用 #13#10

program Project29;

{$APPTYPE CONSOLE}

uses
  SysUtils, PerlRegEx;

var RegEx: TPerlRegEx;

function CStyleEscapes(const InputText:string):string;
var i,j: Integer;

begin
  SetLength(Result, Length(InputText));
  i := 1; // input cursor
  j := 1; // output cursor
  while i <= Length(InputText) do
    if InputText[i] = '\' then
      if i = Length(InputText) then
        begin
          // Eroneous quotation...
          Result[j] := '\';
          Inc(i);
          Inc(j);
        end
      else
        begin
          case InputText[i+1] of
            'r', 'R': Result[j] := #13;
            'n', 'N': Result[j] := #10;
            't', 'T': Result[j] := #9;
            '\':
              begin
                Result[j] := '\';
                Inc(j);
                Result[j] := '\';
              end;
            else
              begin
                Result[j] := '\';
                Inc(j);
                Result[j] := InputText[i+1];
              end;
          end;
          Inc(i,2);
          Inc(j);
        end
    else
      begin
        Result[j] := InputText[i];
        Inc(i);
        Inc(j);
      end;
  SetLength(Result, j-1);
end;

begin
  RegEx := TPerlRegEx.Create;
  try

    RegEx.RegEx := ' ';
    RegEx.Replacement := CStyleEscapes('\t\t\t');;
    RegEx.Subject := 'FirstLine SecondLine';
    RegEx.ReplaceAll;
    WriteLn(RegEx.Subject);

    ReadLn;

  finally RegEx.Free;
  end;
end.
Run Code Online (Sandbox Code Playgroud)

  • @JoacimAndersson正如评论所揭示的那样,你的问题演变为更多关于这个组件理解逃逸的内容.您应该编辑问题以包含这些详细信息. (3认同)

Dav*_*nan 6

我真的很想知道它为什么不按预期进行匹配.

\Replacement文本中执行转义序列的处理TPerlRegEx.ComputeReplacement.如果您查看代码,您会发现没有产生回车符和换行符的序列.事实上ComputeReplacement,所有关于背面参考.

正则表达式的匹配阶段的处理由PCRE代码执行.但是,替换阶段是纯粹的Pascal代码.并且很容易检查代码以查看它的作用.它并没有按照你的想法去做,也不希望它做到.

结论是您无法使用转义序列指定所需的字符.我认为你需要设计自己的规则来转义不可打印的字符,并在OnReplace事件处理程序中应用这些规则.