2011-01-28 90 views
1

我在Perl中創建了一個長度約爲95個字符的正則表達式,我希望將其縮短爲78個字符,但找不到合適的方法。任何意見歡迎,正則表達式類似於下面的代碼,最好有類似的東西在C到\縮短Perl的正則表達式

my ($foo, $bar, $etc) = $input_line =~ 
/^\d+: .... (\X+)\(\X(\d+.\d+|\d+)\/\X(\d+.\d+|\d+) (\X+)\)$/ 
+3

*爲什麼*要將表達式縮短爲* 78 *個字符?爲什麼不是79或77? – thkala 2011-01-28 09:01:18

+0

哦,如果我們知道表達式(順便說一下,你做了*不*後)應該做什麼,我們可能會幫助你更多。 – thkala 2011-01-28 09:02:24

+0

@thkala - 可能是因爲某些編碼風格要求這些行包含不超過79個字符(最好是78)? – eumiro 2011-01-28 09:05:44

回答

0

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 
2

有一種方式來告訴正則表達式來跳過嵌入空白和註釋,這樣不僅可以拆分它可以分爲多行,但也可以對它進行註釋,格式化爲章節等。我認爲它是'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+)\)$/; 

我還沒有這麼長時間,所以我不確定是否需要任何標誌。

0

一件事,我在正則表達式看到的是「\ d +週期\ d +」。

你知道'。'在正則表達式中匹配ANY字符,而不僅僅是實際的字符。

如果您只想指定實際的句點字符,則必須使用'\'。代替。

的另一件事是,你可能能夠取代 '\ d + \ d + | \ d +' 與 '\ d + \ d +?'

[編輯] 還有一件事,如果你使用插入正則表達式不止一次,並且不會在兩次使用之間改變它(例如,在一個循環中),您應該使用/ o選項讓Perl編譯整個正則表達式,因此無需每次都編譯。