2012-08-27 25 views
-1

我想匹配如果某個模式後存在任何字符串。 模式是「模式」'之間的任何事物''[之後]「。不區分大小寫。Perl,模式後的任何匹配字符串

例如

pattern 1 [after] ABC 
pattern 2 [after] 123 abc DEX 
pattern 3 [after] 
pattern 12345123 [after] 
pattern @ASd#98 @_90sd [after] xyz dec 
[after] 4 pattern 

所以想獲得的結果是,

pattern 1 [after] ABC 
pattern 2 [after] 123 abc DEX 
pattern @ASd#98 @_90sd [after] xyz dec 

它開始與「圖案」,並以結束「[後],任何夾之間也被接受。

如果字符串一起存在,我很難將[] &的分隔合併。

我試過,我已經得到了最接近最終匹配

m/pattern/ ../ \[after]/ 

pattern 1 [after] ABC 
pattern 2 [after] 123 ABC DEX 
pattern 3 [after] 
pattern 12345123 [after] 
pattern @ASd#98 @_90sd [after] xyz dec 

但我並不需要第三或第四圖案,之後並無持有任何NUMERICS或字符「[後]」 。

感謝

+0

對不起,但我無法理解你的問題。即使您顯示的正則表達式包含多個斜槓並且不會進行編譯,但您是否顯示文字數據或某種僞語言還不清楚。請顯示真實的數據和你需要匹配或拒絕的例子 – Borodin

+0

我不確定這個正則表達式怎麼沒有爲你編譯,它爲我編譯和符文。帶「..」的多個斜線是perl正則表達式,用於包含兩個模式之間的所有內容。不管有什麼不清楚的地方,請告訴我,我會盡力讓它更有意義。 – user1539348

回答

2

這裏是我用來測試對您輸入(我剛剛cat'ed和管道輸送到腳本)

#!/usr/bin/perl 

while(<>) 
{ 
    print if (/^pattern.*\[after\]\s*\S+/); 
} 

因此,要打破它給你的代碼:

/^pattern:比賽以 「圖案」

.*\[after\]開始任何字符串:後跟任意字符匹配 「[後]」

\s*\S+:匹配0個或多個空格字符,後跟一個或多個非空白字符

這應該足以讓你按照你認爲合適的方式調整它。

+0

感謝您的詳細解釋! – user1539348

0

這是你想要的東西:

/pattern [0-9] \[after\](?= .)/s 

/pattern [0-9] \[after\] ./s 
1

代碼:

$str = 'pattern 2 [after] 123 abc DEX'; 

if ($str =~ m/^pattern\s+(\d+)\s+\[after\]\s+(.+)/) { 
    print "$1\t$2\n"; 
} else { 
    print "(no match)\n"; 
} 

輸出:

2 123 abc DEX 

測試此代碼here