Большую часть времени, когда я ищу шаблон Regex, я получаю его из некоторого php-кода, а затем мне нужно «перенести» в Delphi. Большая проблема в Delphi заключается в том, что php escape не работает в 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, и это не имеет большого значения, массив соответствий пуст. Я знаю, если сложное регулярное выражение шаблона, но если, наконец, мы сможем решить эту проблему, было бы замечательно, есть много кода регулярного выражения php, и если мы сможем узнать, как использовать его в Delphi, это будет здорово для разработчиков Delphi.
Насколько я вижу, поддержка регулярных выражений в PHP основана на PCRE. Как и Delphi, который вы используете. Хотя я предполагаю, потому что вы нигде не утверждаете это. Тем не менее, я думаю, что это достаточно безопасное предположение.
x
Модификатор в PHP соответствует PCRE_EXTENDED
флаг. В Delphi соответствующая настройка roIgnorePatternSpace
вариант. Передайте эту опцию, когда вы звоните Matches
,
Один в сторону. Пожалуйста, не размещайте важный код, используя ссылки за пределами сайта. Нам не нужно оставлять вопрос, чтобы узнать, каков ваш код. Читатель должен иметь возможность получить всю информацию непосредственно из вопроса. Как бы то ни было, читатель может спросить, как этот ответ определяет, какую библиотеку Delphi regex вы используете и что вы вызываете Matches
,
Других решений пока нет …