11

简单代码:

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

4 回答 4

15

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

use re 'regexp_pattern';

print regexp_pattern qr/^\w$/;

印刷

^\w$
于 2011-11-30T18:44:20.640 回答
4

re::regexp_pattern

感谢vpit在MagNET #perl上指出这一点。

于 2011-11-30T18:42:49.707 回答
3

原来是operator,而不是正则表达式模式。仅查看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};
于 2011-11-30T20:42:54.763 回答
0

也许很简单:

...
($reoriginal = $re2) =~ s{^\(\?.+:(.+)\)}{$1};
say $reoriginal
于 2011-11-30T18:45:15.377 回答