我基本上是在做一种单词边界断言.我想做一个测试,如果[abc]不是落后,如果[abc]是提前,反之亦然.
所以我试着对它进行测试并做出这样的否定:
#!/usr/bin/perl
($_) = "abcdef" =~
/
((?&BB).*)
|
(?!)
(?<W>[abc])
(?<NW>[^abc])
(?<BB>
(?<=(?&W))(?=(?&NW))
|(?<=(?&NW))(?=(?&W))
)
/x;
print;
Run Code Online (Sandbox Code Playgroud)
哪个不起作用.但是,如果我这样做:
#!/usr/bin/perl
($_) = "abcdef" =~
/
((?&BB).*)
| (?!)
(?<W>[abc])
(?<NW>[^abc])
(?<BB>
(?<=[abc])(?=[^abc])
| (?<=[^abc])(?=[abc])
)
/x;
print;
Run Code Online (Sandbox Code Playgroud)
确实如此.这里发生了什么?可变长度看起来在哪里?
仅供参考,我知道这个消息意味着什么.我想知道为什么perl认为命名组的长度可变,我怎么能让它停止思考呢?对我来说,这看起来像是一个错误.其他人同意吗?
使用版本:
This is perl 5, version 14, subversion 4 (v5.14.4) built for cygwin-thread-multi
This is perl 5, version 16, subversion 2 (v5.16.2) built for i686-linux
Run Code Online (Sandbox Code Playgroud)
编辑
所以我找到了一个足够的工作.
#!/usr/bin/perl
$chars = qr/[abc]/;
$notChars = qr[^abc]/;
($_) = "abcdef" =~
/
((?&BB).*)
| (?!)
(?<BB>
(?<=$chars)(?=$notChars)
| (?<=$notChars)(?=$chars)
)
/x;
print;
Run Code Online (Sandbox Code Playgroud)
lookbehind节点只是查看其子节点,看到它包含一个命名的子规则匹配,并确定命名的子规则匹配不一定是固定长度.它没有查看命名子规则内部以发现它实际上确实具有固定长度,并且我不确定它是否可以给出代码的当前状态.由于它无法确定固定长度,因此无法编译后备.
也许消息应该是沿着Can't determine the length of '(?&W)' for use in lookbehind而不是Variable length lookbehind not implemented.