我基本上正在制作一种单词边界断言。我想测试如果[abc]
不在后面,如果[abc]
在前面,并反之亦然。
所以我试图进行测试并像这样否定:
#!/usr/bin/perl
($_) = "abcdef" =~
/
((?&BB).*)
|
(?!)
(?<W>[abc])
(?<NW>[^abc])
(?<BB>
(?<=(?&W))(?=(?&NW))
|(?<=(?&NW))(?=(?&W))
)
/x;
print;
这不起作用。 但是,如果我这样做:
#!/usr/bin/perl
($_) = "abcdef" =~
/
((?&BB).*)
| (?!)
(?<W>[abc])
(?<NW>[^abc])
(?<BB>
(?<=[abc])(?=[^abc])
| (?<=[^abc])(?=[abc])
)
/x;
print;
确实如此。 发生了什么? 变长回溯在哪里?
顺便说一句,我知道这个消息的意思。 我想知道为什么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
编辑
所以我找到了一个足够好的解决办法。
#!/usr/bin/perl
$chars = qr/[abc]/;
$notChars = qr[^abc]/;
($_) = "abcdef" =~
/
((?&BB).*)
| (?!)
(?<BB>
(?<=$chars)(?=$notChars)
| (?<=$notChars)(?=$chars)
)
/x;
print;