2011-01-26 58 views
1

我遇到了正則表達式語法的麻煩。在eclipse中匹配非註釋模式

我想匹配某個單詞後跟一個數字的所有匹配項,但不包括被評論的行。

評論是(多)###### ...

例子:

#This is a comment <- no match 

#This is a comment myword 8 <- no match 

my $var = 'myword 12'; <- match 

my $var2 = 'myword'; <- no match 

直到現在我還
一部開拓創新的模式:^[^(\#+)](.*?)(myword \d+)(.*?)$
新格局:^([^\#]*?)(myword\s+\d+)(.*?)$

它應該匹配不以一個或多個#開頭的行,然後是某些內容,然後是我正在搜索的單詞編號組合,最後是一些內容。

如果註釋不是從行首開始,也可能會匹配部分行。

my $var3 = 'test';#myword 8 <- no match 

我在做什麼錯?

我想在Eclipse的文件搜索(使用Perl史詩模塊)中使用它。

編輯:的新格局我確實沒有返回錯誤匹配,但它返回多個,其中包括myword該行前幾行就行了。我不確定它會返回所有匹配。

回答

3

請注意,[]是字符類。你不能在那裏使用量詞。他們就像. - 匹配那裏給出的任何角色。然後可以對點本身或character class進行量化。

在你的榜樣,[^(#+)]將取決於味道(我猜)#\除了()+,並且匹配一切。

所以你想要在這裏匹配一條以除#以外的任何字符開頭的行。 (我認爲)

問題是#可能發生在字符串中,它不是註釋。 (關於註釋不是從行首開始)

+0

有道理...... +1 – DVK 2011-01-26 23:59:04

+0

你說得對與`[]`錯誤的用法。我不認爲在我的情況下,有任何使用#的字符串,它不是**的評論。即使有,我也可以忽略這些情況。 – Pit 2011-01-27 07:38:49

2

Re:註釋不在字符串的開頭。

爲此(例如,不要錯過任何有效的匹配),你幾乎必須正確地解析文件的特定編程語言的語法,所以你不能用做這個(很容易,甚至所有)正則表達式。

如果您不這樣做,您可能會遺漏字符串"this is my #hash"後缺少有效的搜索匹配,該匹配遵循除註釋開始以外的其他語境中使用的「#」 - 作爲幾乎任何語言的常見示例。

在Perl中,「#」也可能顯示爲正則表達式分隔符,$#myArr(數組最後一個元素的索引)或 - 歡樂的快樂 - 作爲識別符名稱中的有效字符!

+0

正如我對西蒙的回答評論的那樣,我認爲除了評論之外並沒有使用`#`,甚至可以忽略這些情況。我不錯,錯過一些**正確的**比賽,我只想消除大多數** false **(aka。comments)比賽。 – Pit 2011-01-27 07:42:54

0

當然,如果您意識到這些問題並仍想使用正則表達式來提取內容。像這樣的東西可能是有用的:

^[^\#].[^\n\#]+myword\s\d+.[$;]+ 

這是一個有點複雜,但我希望它會爲你的作品。 對於我這個如下一致:

my $var = 'myword 12'; <- match 
my $var = 'myword 17'; <- match 
my $var2 = 'myword'; <- no match 
my $var = 'myword 9'; #'myword 17'; <- partly match 
my $var = 'myword 8'; ##'myword 127'; <- partly match 
my $var = ;#'myword 17'; <- no match 
#my $var = 'myword 13'; <- no match 
##my $var2 = 'myword 14'; <- no match