3

FreePascal/Lazarus で RegExp 置換を行う簡単な方法はありますか?

探し回ってみると、かなり簡単に一致させることができることがわかりますが、検索と置換を行う関数を見つけるのに苦労しています。

私が達成しようとしていることは次のとおりです。

  • SynEdit コンポーネントに XML ファイルをロードしました。
  • XML ファイルの先頭に宣言があります
  • DTD は別のファイルに保持されます。
  • この 2 つを 1 つのファイルにまとめたくはありませんが、編集中の 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 の正しい位置にあるとは想定したくありません-物事を複雑にするためです。

ありがとう、

FM

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 に答える