如何在Delphi中使用php模式Regex



大多数时候,当我寻找Regex模式时,我会从一些php代码中获得它,然后我需要"tralate"到Delphi。Delphi中的大问题是php转义在Delphi中不起作用,但如果你在大多数时候忽略它们,一切都会好起来。但在下一个例子中不是这样,如果你从模式中删除/x,函数preg_match_all不会输出任何值。

这是php:中的代码

 $pattern = "/n".
     "s(counters?\([^)]*\))|n".
     "A(counters?\([^)]*\))|n".
     "s(["']) ( (?:[^"']|\\["'])+ )(?<!\\)\3|n".
     "A(["']) ( (?:[^"']|\\["'])+ )(?<!\\)\5|n" .
     "s([^s"']+)|n" .
     "A([^s"']+)n".
     "/xi";
    preg_match_all($pattern, '"File " counter(File)', $matches, PREG_SET_ORDER);

这是输出:

array (size=2)
  0 => 
    array (size=7)
      0 => string '"File "' (length=7)
      1 => string '' (length=0)
      2 => string '' (length=0)
      3 => string '' (length=0)
      4 => string '' (length=0)
      5 => string '"' (length=1)
      6 => string 'File ' (length=5)
 1 => 
    array (size=2)
      0 => string ' counter(File)' (length=14)

这就是我在Delphi:中所做的

 type
 TMatches = Array of Array of String;
 var
   matches: TMatches;
 pattern :=  '/n'+
   's(counters?\([^)]*\))|n'+
   'A(counters?\([^)]*\))|n'+
   's(["'']) ( (?:[^"'']|\\["''])+ )(?<!\\)\3|n'+
   'A(["'']) ( (?:[^"'']|\\["''])+ )(?<!\\)\5|n'+
   's([^s"'']+)|n'+
   'A([^s"'']+)n'+
   '/xi';
   RegExMatchAll(pattern,'"Page " counter(page)',matches);

函数RegExMatchAll我从这里得到它,在大多数情况下都有效:

    procedure RegExMatchAll(Pattern: String; Subject: String; out Matches: TMatches);
    var D, sD: integer; RegEx: TRegEx; RegGroupColl: TGroupCollection; RegColl: TMatchCollection;
    begin
      RegEx := TRegEx.Create(Pattern);
      RegColl := RegEx.Matches(Subject);
      SetLength(Matches, RegColl.Count); // Numero de coincidencias [array [X]]
      for D := 0 to RegColl.Count - 1 do
      begin
         RegGroupColl := RegColl.Item[D].Groups;
         SetLength(Matches[D], RegGroupColl.Count); // Numero de grupos [array [D][sD]]
         for sD := 0 to RegGroupColl.Count - 1 do Matches[D][sD] := RegGroupColl.Item[sD].Value;
      end;
    end;

此外,我将\n更改为#13#10,这并不重要,matches数组为空。我知道这是一个困难的模式正则表达式,但如果我们最终能够解决这个问题,那将是非常棒的,有很多php正则表达式代码,如果我们能够知道如何在Delphi中使用它,这将对Delphi开发人员非常好。

据我所见,PHP的正则表达式支持是建立在PCRE之上的。就像德尔福的一样,你似乎正在使用它。尽管我猜是这样,因为你哪里也没有说明这一点。然而,我认为这是一个相当安全的假设。

PHP中的x修饰符对应于PCRE_EXTENDED标志。在Delphi中,相应的设置是roIgnorePatternSpace选项。调用Matches时传递该选项。

一个在一边。请不要使用非现场链接发布重要代码。我们不应该为了了解你的代码而离开这个问题。读者应该能够直接从这个问题中获得所有信息。事实上,读者会想知道这个答案是如何识别您使用的Delphi regex库以及您正在调用的Matches的。

最新更新