如何在Delphi中使用php模式Regex


How to use php pattern Regex in Delphi

大多数时候,当我寻找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的。