更新
正如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可以匹配换行符。