需要正则表达式的解释

时间:2015-02-21 17:37:28

标签: regex

我的学生指南包含此示例。

我需要在运输中找到所有 -tation ,但不是驱逐出境
我使用带有lookbehind断言的正则表达式

/(?<=transpor)tation/

还有一个等效的

/tation(?<=transportation)/

它说第一个正则表达式

  

效率更高,因为它没有回溯 - 引擎没有   第二次检查。

确定。这很好。
对我来说有一个模糊的短语

  

通常它会在第一次匹配文本或使用a   预测它会检查它是否与第二种模式匹配而不是   第二次回顾它,带着一个后视镜。

我无法理解两个提示(尤其是关于先行断言)。(在或之前或之后)
我相信我的谜语(谜题)至少会以母语为英语的人清楚。

感谢。

1 个答案:

答案 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)"'

在这里,编译后的表达似乎没有什么不同。