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