2012年4月8日星期日

Programming Perl 4th : Chapter 5 正则

/p 会把正则匹配相关的内容保留到 ${^MATCH},${^PREMATCH},${^POSTMATCH}

/r 保留原来变量的值不变,返回替换后的新值

$+{name} 保存命名正则(?<name>...)最近一次匹配的内容

@{ $-{name} } 保存命名正则(?<name>...)多次匹配的内容

假设 $pattern_str 是正则式匹配串:
  • 如果在某个循环中, ... if(/$pattern_str/) 则每次调用都会重复编译成正则式
  • 如果在进入循环之前,先 $pattern = qr/$pattern_str/,则 ... if(/$pattern/) 每次调用不会重复编译成正则式

use re 'debug'; 可以看正则式解析过程

NFA会记录上次匹配位置,失败后回溯,再到下一个位置重复尝试匹配

(?> PATTERN)  与 (?: PATTERN) 用法类似,但 (?> PATTERN) 只要能匹配上,不管后续整体正则式匹配是否成功,都不回溯。

好处在于失败时能够迅速跳出,不尝试多余都回溯;当然,(?> PATTERN)  的"失败"有可能是判断错误的。

例子: "aaab" =~ /(?:a*)ab/ 成功, "aaab" =~ /(?>a*)ab/ 失败

(?>.+) 可以缩写为 .++

s/(\d+)/$1 * 2/e;  # Replaces "42" with "84"

s/PATTERN/CODE/ee 相当于 s/PATTERN/eval(CODE)/e

(?{ CODE })  好麻烦,暂时跳过不看了,P299

(?(COND)IFTRUE|IFFALSE) 比较帅!

perl支持切换正则引擎,例如re::engine::RE2等。

RE2的相关资料:

  • Regular Expression Matching Can Be Simple and Fast
  • Regular Expression Matching: The Virtual Machine Approach
  • Regular Expression Matching in the Wild

没有评论:

发表评论