3

有没有一种简单的方法可以在 FreePascal/Lazarus 中进行 RegExp 替换?

四处打猎我可以看到我可以很容易地进行匹配,但我正在努力寻找功能来进行搜索和替换。

我想要达到的目标如下。

  • 我有一个 XML 文件加载到 SynEdit 组件中。
  • XML 文件在开头有一个声明
  • DTD 保存在一个单独的文件中。
  • 我不想将两者合并到一个文件中,但我确实想在编辑 XML 时对其进行验证。
  • 我正在将 XML 读入一个字符串变量,并且我想在一个临时字符串变量中插入和 XML 内容之间的 DTD(以创建具有自包含 DTD 的兼容 XML),该变量可以被解析和验证。

所以基本上我有:

<?Line1?>
Line2
Line3

我想进行 RegExp 类型搜索并替换 '<?Line1?>' 替换为 '<?Line1?>\n<![DTD\nINFO WOULD\nGO HERE\n!]' 给我:

<?Line1?>
<![DTD
INFO WOULD
GO HERE
!]
Line2
Line3

例如在 PHP 中我会使用:

preg_replace('/(<\?.*\?>)/im','$1
<![DTD
INFO WOULD
GO HERE
!]',$sourcestring);

但是对于 FreePascal / Lazarus 似乎没有一组等效的正则表达式函数 - 只是一个简单/基本的正则表达式匹配函数。

或者有没有使用正则表达式的更简单的方法 - 我不想假设声明总是在第 1 行的正确位置 - 只是为了使事情复杂化。

谢谢,

调频

4

1 回答 1

2

据我所知,PerlRegEx 单元与 Free Pascal 不兼容。但是您可以使用 Free Pascal 附带的 RegExpr 单元。

如果我理解正确,您需要替换替换。这是一个简单的示例,您可以根据自己的需要进行调整。

{$APPTYPE CONSOLE}
{$IFDEF FPC}{$MODE DELPHI}{$ENDIF}

uses
  regexpr;

var
  s: string;

begin
  s := 'My name is Bond.';

  s := ReplaceRegExpr(
    'My name is (\w+?)\.',
    s,
    'His name is $1.',
    TRUE // Use substitution
  );

  WriteLn(s); // His name is Bond.
  ReadLn;
end.
于 2015-12-10T09:32:31.560 回答