我的学生指南包含此示例。
我需要在运输中找到所有 -tation ,但不是驱逐出境。
我使用带有lookbehind断言的正则表达式
/(?<=transpor)tation/
还有一个等效的
/tation(?<=transportation)/
它说第一个正则表达式
效率更高,因为它没有回溯 - 引擎没有 第二次检查。
确定。这很好。
对我来说有一个模糊的短语
通常它会在第一次匹配文本或使用a 预测它会检查它是否与第二种模式匹配而不是 第二次回顾它,带着一个后视镜。
我无法理解两个提示(尤其是关于先行断言)。(在或之前或之后)
我相信我的谜语(谜题)至少会以母语为英语的人清楚。
感谢。
答案 0 :(得分:0)
我不会考虑它;这些陈述似乎是基于对正常表达引擎的内部逻辑的假设,这些假设并不普遍有效。
为了解释这一点,我查看了Perl的正则表达式编译器的调试信息。
Code:
use re 'debug';
/(?<=transpor)tation/;
/tation(?<=transportation)/;
输出:
Compiling REx `(?<=transpor)tation'
size 11 Got 92 bytes for offset annotations.
first at 1
1: IFMATCH[-8](8)
3: EXACT <transpor>(6)
6: SUCCEED(0)
7: TAIL(8)
8: EXACT <tation>(11)
11: END(0)
anchored `tation' at 0 (checking anchored) minlen 6
Offsets: [11]
12[8] 0[0] 5[8] 0[0] 0[0] 12[0] 12[0] 14[6] 0[0] 0[0] 20[0]
Compiling REx `tation(?<=transportation)'
size 13 Got 108 bytes for offset annotations.
first at 1
1: EXACT <tation>(4)
4: IFMATCH[-14](13)
6: EXACT <transportation>(11)
11: SUCCEED(0)
12: TAIL(13)
13: END(0)
anchored `tation' at 0 (checking anchored) minlen 6
Offsets: [13]
1[6] 0[0] 0[0] 24[14] 0[0] 11[14] 0[0] 0[0] 0[0] 0[0] 24[0] 24[0] 26[0]
Freeing REx: `"(?<=transpor)tation"'
Freeing REx: `"tation(?<=transportation)"'
在这里,编译后的表达似乎没有什么不同。