2009-11-15 53 views
1

我用Regexp::Assemble在我的項目,但我不明白爲什麼這個小樣本不起作用:爲什麼Regexp :: Assemble使用這些簡單的正則表達式失敗?

#!/usr/bin/perl 

use strict; 
use warnings; 

use Regexp::Assemble; 

my $re1 = "(run (?:pre|post)flight script for .+)"; 
my $re2 = "((?:Configu|Prepa)ring volume .+)"; 

my $ra = Regexp::Assemble->new; 
$ra->add($re1); 
$ra->add($re2); 
my $global = $ra->re; 

print "GLOBAL: $global\n"; 

1; 

我得到這個錯誤:

Unmatched (in regex; marked by <-- HERE in m/(<-- HERE ?:(run (?:pre|post)flight script for|((?:Configu|Prepa)ring volume) .+)/ at /usr/share/perl5/Regexp/Assemble.pm line 1003. 

編輯: 如果我只是打印生成的正則表達式($ ra-> as_string)我得到這個:

GLOBAL: (?:(run (?:pre|post)flight script for|((?:Configu|Prepa)ring volume) .+) 

有一個「)」失蹤......

回答

2

這看起來像一個錯誤?你正混淆正則表達式的構造函數。看看它是如何結合你的兩個模式和不匹配的括號:

my $re1 =  "(run (?:pre|post)flight script for .+)"; 
my $re2 =          "((?:Configu|Prepa)ring volume .+)"; 

#   m/(?:(run (?:pre|post)flight script for|((?:Configu|Prepa)ring volume) .+)/ at... 

嘗試從你的正則表達式刪除多餘的括號,並看看是否有幫助:

my $re1 = "run (?:pre|post)flight script for .+"; 
my $re2 = "(?:Configu|Prepa)ring volume .+"; 
+0

是的,它的工作沒有額外的括號...但這裏只是一個例子,我需要這些更爲複雜的正則表達式! – sebthebert

+0

那麼,這個回答你寫它的問題... :)也許編輯您的問題給出這麼mething更復雜的例子嗎? – Ether

+0

好的,我應該添加「以及如何修復,而不修改我的正則表達式」:)任何想法? – sebthebert

4

甲醚的做法似乎是一個計劃 - 如果你看看模塊文檔也特別提到要注意:

add() ... 它採用了天真的正則表達式來萊克斯可能[按]複雜的表達式(特別是被愚弄的字符串,它將無法LEX嵌套的括號表達式,例如ab(cd(ef)?gh)ij)。如果是這種情況,字符串的結尾將不會正確標記,並返回爲一個長字符串。

+0

我沒有讀過,在我的第一次讀... :( – sebthebert

+0

好的謝謝,你回答'爲什麼',但我也''如何修復':) :) – sebthebert

4

我[R :: A的作者。這個問題每隔幾年就會出現一次。這個想法是,你不想添加複雜的父母化模式。添加更多,更簡單的圖案,例如

run preflight script for .+ 
run postflight script for .+ 
Configuring volume .+ 
Preparing volume .+ 

不要嘗試和做模塊的工作。舉例來說,你過早的分組已經導致INT常見的拖尾.+不被計入在正則表達式一個occurence所有模式。結果是你引入了不必要的回溯。你添加的模式越多,它會變得越糟糕。

以不同順序調用add()將產生相同的結果模式(否則它是我想知道的錯誤)。

否則,您可以自己預先模式化模式,並使用insert()將模式詞位直接插入到用於構建模式的內部特里結構中。 (這樣做會快得多,因爲詞法分析器速度很慢:它在組裝模式時耗費了超過一半的運行時間)。

+0

當我組裝上述四種模式,我得到'(?:run p(?:ost | re)飛行腳本爲|(?:Configu | Prepa)鈴聲音量)+。注意模塊如何將(p |)從(post | pre)變更中提升出來? – dland

相關問題