我在Perl中創建了一個長度約爲95個字符的正則表達式,我希望將其縮短爲78個字符,但找不到合適的方法。任何意見歡迎,正則表達式類似於下面的代碼,最好有類似的東西在C到\縮短Perl的正則表達式
my ($foo, $bar, $etc) = $input_line =~
/^\d+: .... (\X+)\(\X(\d+.\d+|\d+)\/\X(\d+.\d+|\d+) (\X+)\)$/
我在Perl中創建了一個長度約爲95個字符的正則表達式,我希望將其縮短爲78個字符,但找不到合適的方法。任何意見歡迎,正則表達式類似於下面的代碼,最好有類似的東西在C到\縮短Perl的正則表達式
my ($foo, $bar, $etc) = $input_line =~
/^\d+: .... (\X+)\(\X(\d+.\d+|\d+)\/\X(\d+.\d+|\d+) (\X+)\)$/
Perl的插值正則表達式,所以你可以做這樣的事情
my $input_line = '123: .... X(X1.1/X5 XXX)';
my $dOrI = '(\d+.\d+|\d+)';
my ($foo, $bar, $etc) = $input_line =~
/^\d+: .... (\X+)\(\X$dOrI\/\X$dOrI (\X+)\)$/;
print "$foo, $bar, $etc";
輸出 -
X, 1.1, 5
有一種方式來告訴正則表達式來跳過嵌入空白和註釋,這樣不僅可以拆分它可以分爲多行,但也可以對它進行註釋,格式化爲章節等。我認爲它是'x',但我現在沒有文檔,所以請在手冊頁中查看它。
所以,你會改變它的東西,如:
my ($foo, $bar, $etc) = $input_line =~/
^\d+: ....
(\X+)\(
\X(\d+.\d+|\d+) # numerator
\/\X(\d+.\d+|\d+) # denominator
\ (\X+)\)$/x # mind the escaped space!
也有可能通過「QR」字符串前綴分別構建正則表達式的片段,並使用變量替換將它們結合起來。類似於
my $num_re = qr/(\X+)\(\X(\d+.\d+|\d+)\/\X(\d+.\d+|\d+)/;
my ($foo, $bar, $etc) = $input_line =~ /^\d+: .... $num_re (\X+)\)$/;
我還沒有這麼長時間,所以我不確定是否需要任何標誌。
一件事,我在正則表達式看到的是「\ d +週期\ d +」。
你知道'。'在正則表達式中匹配ANY字符,而不僅僅是實際的字符。
如果您只想指定實際的句點字符,則必須使用'\'。代替。
的另一件事是,你可能能夠取代 '\ d + \ d + | \ d +' 與 '\ d + \ d +?'
[編輯] 還有一件事,如果你使用插入正則表達式不止一次,並且不會在兩次使用之間改變它(例如,在一個循環中),您應該使用/ o選項讓Perl編譯整個正則表達式,因此無需每次都編譯。
*爲什麼*要將表達式縮短爲* 78 *個字符?爲什麼不是79或77? – thkala 2011-01-28 09:01:18
哦,如果我們知道表達式(順便說一下,你做了*不*後)應該做什麼,我們可能會幫助你更多。 – thkala 2011-01-28 09:02:24
@thkala - 可能是因爲某些編碼風格要求這些行包含不超過79個字符(最好是78)? – eumiro 2011-01-28 09:05:44