perl:如何从预编译版本中获取原始正则表达式?

时间:2011-11-30 18:06:07

标签: perl

简单代码:

use 5.014;
use warnings;

my $re = <DATA>;
chomp $re;
my $re2 = qr/$re/;
say $re2;
__END__
^\w$

结果:

(?^u:^\w$)      #added the (?^u:

是否有正确的方法来反编译$ re2取回原始正则表达式?

动机:正则表达式是配置值,因此需要:

  • 读它
  • 编译
  • 将其保存到文件中供以后使用。

但是无法保存已编译的正则表达式以供以后使用,因为在每次编译时,正则表达式都被扩展了(?^ u:,所以经过几个周期后我结束了像:

(?^u:(?^u:(?^u:(?^u:(?^u:^\w$)))))

因此问题是:

  • 在这里有任何正确的方法,如何保存编译版本?
  • 如果没有办法 - 如何反编译,获得原始版本?
  • 任何想法?

4 个答案:

答案 0 :(得分:15)

虽然我只是保留字符串副本以便使用数据,然后在需要使用它时编译副本,但您也可以使用核心re模块中的regexp_pattern函数返回用于创建已编译的正则表达式的模式:

use re 'regexp_pattern';

print regexp_pattern qr/^\w$/;

打印

^\w$

答案 1 :(得分:4)

答案 2 :(得分:3)

原始是运算符,而不是正则表达式模式。仅查看regexp_pattern返回的第一个值(模式)会导致信息丢失。您还需要查看第二个(标志)。

qr/foo/                  # pat: foo  flags: u
qr/foo/u                 # pat: foo  flags: u
use re '/u';  qr/foo/    # pat: foo  flags: u

qr/foo/a                 # pat: foo  flags: a
use re '/a';  qr/foo/    # pat: foo  flags: a

qr/foo/i                 # pat: foo  flags: ui
use re '/i';  qr/foo/    # pat: foo  flags: ui
use re '/a';  qr/foo/i   # pat: foo  flags: ai
use re '/ai'; qr/foo/    # pat: foo  flags: ai

为了获得尽可能接近的原因,您可以使用原始运算符

use re qw( regexp_pattern );
my ($pat, $flags) = regexp_pattern($re);
$pat =~ s{/}{\\/}g;
say qq{qr/$pat/$flags};

答案 3 :(得分:0)

也许很简单:

...
($reoriginal = $re2) =~ s{^\(\?.+:(.+)\)}{$1};
say $reoriginal