【发布时间】:2018-10-26 05:47:19
【问题描述】:
读完How does \G work in .split?之后,我很快设置了一个Delphi程序来检查PCRE如何处理这种情况。有趣的是,结果与 java 的情况不同:
program Project1;
{$APPTYPE CONSOLE}
uses
System.RegularExpressions;
var
SArr: TArray<string>;
S: string;
begin
SArr := TRegex.Split('abcdefghij', '(?<=\G..)',[]);
for S in SArr do
begin
WriteLn(S);
end;
ReadLn;
end.
输出:
ab
cde
fgh
ij
为什么 PCRE 结果与 Java 不同?如何解释这种行为?
为确保这不是 Delphi 错误,我在正则表达式 101 中进行了测试,匹配行为似乎相同:https://regex101.com/r/GE6eRI/1
【问题讨论】:
-
根据我的经验,
'(?<=\G..)'仅适用于 Java 正则表达式,这就是为什么我说我不会依赖这种模式。幸运的是,有一些方法可以解决它(例如匹配/../g等)。 -
似乎
\G的第一次调用在它应该匹配的下一个位置前进,否则使用\K影响这个指针不应该改变任何东西(?<=\K\G..) -
我鼓励你添加
java标签,因为它是一种口味间的比较。 -
@revo 添加 Java 和 regex-lookarounds。我不确定 java 标签(因为我的问题没有使用任何 java 代码)和 delphi 标签(因为它只是用来显示 pcre 行为),但包含两者似乎是有意义的。跨度>
标签: java regex delphi pcre regex-lookarounds