德尔福正则表达式的最大模式"separation"?



更新

正如Graymatter所观察到的,当第二个目标之前至少有两个额外的换行符时,regex将无法匹配。也就是说,将连接循环更改为"0";对于I:=0到1";将使正则表达式匹配失败。


如下面的代码所示,在没有串联的情况下,程序可以使用regex获得这两个值。但是,使用串联,程序无法获得这两个值。

你能帮忙评论一下原因和解决方法吗?

program Project1;
{$APPTYPE CONSOLE}
uses
  // www.regular-expressions.info/delphi.html
  // http://www.regular-expressions.info/download/TPerlRegEx.zip
  PerlRegEx,
  SysUtils;
procedure Test;
var
  Content: UTF8String;
  Regex: TPerlRegEx;
  GroupIndex: Integer;
  I: Integer;
begin
  Regex := TPerlRegEx.Create;
  Regex.Regex := 'Value1 =s*(?P<Value1>d+)s*.*s*Value2 =s*(?P<Value2>d*.d*)';
  Content := '';
  for I := 0 to 10000000 do
  begin
    // Uncomment here to see effect
    // Content := Content + 'junkjunkjunkjunkjunk' + sLineBreak;
  end;
  Regex.Subject := 'junkjunkjunkjunkjunk' +
    sLineBreak + ' Value1 = 1' +
    sLineBreak + 'junkjunkjunkjunkjunk' + Content +
    sLineBreak + ' Value2 = 1.23456789' +
    sLineBreak + 'junkjunkjunkjunkjunk';
  if Regex.Match then
  begin
    GroupIndex := Regex.NamedGroup('Value1');
    Writeln(Regex.Groups[GroupIndex]);
    GroupIndex := Regex.NamedGroup('Value2');
    Writeln(Regex.Groups[GroupIndex]);
  end
  else
  begin
    Writeln('No match');
  end;
  Regex.Free;
end;
begin
  Test;
  Readln;
end.

添加此行即可。

  Regex.Options := [preSingleLine];

来自文件:

preSingleLine

通常,点(.(与换行符(\n(以外的任何字符都匹配。使用preSingleLine,点(.(将匹配任何内容,包括换行符。这允许将多行字符串视为单个实体。相当于Perl的/s修饰符。请注意,preMultiLine和preSingleLine可以一起使用。

当第二个目标之前只有一个换行符时,即使没有preSingleline,regex也可以匹配。原因是%s可以匹配换行符。

最新更新