FreePascal正则表达式替换

3
有没有一种简单的方法可以在FreePascal/Lazarus中进行RegExp替换?
我找到了一些关于如何匹配的信息,但是我很难找到执行搜索和替换的函数。
我的目标如下:
- 我已经将一个XML文件加载到SynEdit组件中。 - XML文件在开头有一个声明。 - DTD保存在一个单独的文件中。 - 我不想将两个文件合并为一个,但我想在编辑时验证XML。 - 我将XML读入一个字符串变量中,并想要在临时字符串变量中在<?xml version="1.0" encoding="utf-8"?>和XML内容之间插入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似乎没有等效的正则表达式函数集——只有一个简单/基本的RegExp匹配函数。
或者有没有不使用正则表达式的更简单方法——我不想假定声明总是在正确的位置上的第一行,以免使事情复杂化。
谢谢,
FM

1
我通常避免使用正则表达式,但据我所知,有一些 PCRE 标头转换可用。 - Marco van de Voort
这让我朝着正确的方向进行搜索,我想。找到了一些兼容Delphi的包装版本,现在只需要弄清楚如何集成到Lazarus中了。 - Fat Monk
感谢@Marco-van-de-Voort。我已经下载了TPerlRegEx,从阅读周围的内容来看,这似乎是一个非常好的库,但我无法弄清楚或找到有关如何将Delphi库包(我知道这可能不是一个特别正确的术语)集成到Lazarus中的任何文档。有人可以给我一些指针吗? - Fat Monk
不需要这样做,这只对(设计时)控件是必要的。获取基本单元,然后将其放在编译器可以找到的地方即可。可能包含具有正则表达式验证器的tedits。 - Marco van de Voort
在这里,您可以阅读有关支持搜索和替换的PCRE2库的更多信息:http://www.regular-expressions.info/pcre.html - macf00bar
显示剩余4条评论
1个回答

2
据我所知,PerlRegEx单元与Free Pascal不兼容。但是您可以使用RegExpr单元,它与Free Pascal一起提供。
如果我理解正确,您想要一个替换和替代的方法。这里有一个简单的示例,您可以根据自己的需要进行调整。
{$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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接