简单代码:
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$)))))
因此问题是:
答案 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