freepascal regexp替换

时间:2013-03-27 14:52:24

标签: regex replace pascal freepascal lazarus

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

狩猎我可以看到我可以相当容易地进行匹配,但是我很难找到执行搜索和替换的功能。

我正在努力实现的目标如下。

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

基本上我有:

<?Line1?>
Line2
Line3

我想进行RegExp类型搜索并替换'&lt;?Line1?&gt;'替换为'&lt;?Line1?&gt; \ n&lt;![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似乎没有一套等效的regexp函数 - 只是一个简单/基本的RegExp匹配函数。

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

谢谢,

FM

1 个答案:

答案 0 :(得分:1)

据我所知,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.