2012-10-04 80 views
0

我有一個腳本,我需要跳過註釋,並且我能夠部分地實現它...perl的字符串匹配問題

IN : 

{**************************** 
{test : test...test } 

Script: 

if ($data =~ m/(^{\*+$)/){ 
} 

通過以上的比賽,我能夠確定的評論,並跳過它得到下一行..

Out: 
{test : test...test } 

如果相同的評論由任何空間或*的地方的任何字符,我的比賽失敗的..

IN: 
{** ***** or {* abccd or {*abce 

上述所有情況下都未能跳過...... 什麼可能在比賽中被撥錯,......任何一個可以幫助我..

回答

1

在你的正則表達式的$是表示結束的錨串/線,堅持,當你有一個排滿* S中的初始{

後刪除此錨將允許所有三種情況相匹配的匹配只會發生:

for ('{*********', '{** *****', ,'{* abccd' , '{*abce') { 

    print "$_ Matches\n" if /^{\*+/; 
} 
+0

我試圖刪除錨,但我得到一個錯誤......說..「在未連接(。)或字符串中使用未初始化的值」 – Anil

+0

@NEW:您的代碼是否超出您所使用的值? – Zaid

+0

是我試圖用於上述輸入相同的模式匹配.. – Anil

0

目前還不清楚確切地說,評論的語法是在你的te中xt,但給出的例子,我打算假設{*在一行的開頭,其次是什麼,直到行的末尾,是一個評論。

在這種情況下,您的正則表達式/(^{\*+$)/將無法​​正常工作。上面寫着:

  1. ^ - 匹配行的開頭
  2. { - 匹配一個{
  3. \*+ - 匹配一個或多個*小號
  4. $ - 匹配一行的末尾

如果在*和之間有其他內容出現,此模式將不匹配 隊伍的盡頭。

類似/^{\*.+$/應該做你想做的。這會更改您的模式以匹配一個或多個非換行符(.),直到到達行尾。

+0

我試過使用相同的,但我得到一個錯誤...說...「使用未初始化的值在串聯(。)或字符串」 – Anil

+2

該警告(不是錯誤)與您可能使用的特定正則表達式無關。找出未定義的值並定義它。 – friedo

0

如果你想允許{*部分背後的其他字符,那麼只需從模式中刪除$

這是一個簡單的Perl代碼,您可以用開始:

@data = <main::DATA>; 
print map { $_ if !/^{\*+/ } @data; 

__DATA__ 
{**************************** 
{test : test...test} 

輸出

{test : test...test} 

測試此代碼here