2011-11-30 25 views
11

簡單代碼: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$))))) 
因此

的問題是:

  • 是這裏的任何正確的方法,如何保存編譯版本
  • 如果沒有辦法 - 如何分解,以獲得原始版本
  • 01?
  • 有什麼想法嗎?
+0

你說你從文件中讀取模式,所以你必須要保存到一個文件是什麼,所以你爲什麼不保存它? – ikegami

回答

14

雖然我只是不停地對數據使用串繞副本,然後編一個副本時,我需要使用它,你也可以使用regexp_pattern功能從核心re模塊返回用於創建編譯模式正則表達式:

use re 'regexp_pattern'; 

print regexp_pattern qr/^\w$/; 

打印

^\w$ 
+0

這正是我需要的。使用5.10以上的Perl - 很好......;)THANX! – jm666

+0

這不是它打印的內容,至少不是5.14。 – ikegami

+0

qr/foo \/bar/ – ikegami

0

也許就這麼簡單:

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

小心,版本不一致:http://stackoverflow.com/q/8082617#comment-10190574 – daxim

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}; 
+0

非常感謝! – JRFerguson

+0

我正在編譯我的正則表達式沒有標誌,所以Erics簡單版本就足夠了。無論如何,非常感謝您的詳細解釋! – jm666

+0

@ jm666,再一次,如果你知道這一點,爲什麼你需要從重新提取原始模式? – ikegami