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