在eclipse中匹配非注释模式

时间:2011-01-26 14:47:28

标签: regex eclipse perl

我遇到了使用正则表达式语法的麻烦。

我希望匹配某个单词后跟一个数字的所有匹配项,但排除被评论的行。

评论为(多个)###### ...

示例:

#This is a comment  <- no match

#This is a comment myword 8 <- no match

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

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

直到现在我还有 orignal pattern: ^[^(\#+)](.*?)(myword \d+)(.*?)$
新模式: ^([^\#]*?)(myword\s+\d+)(.*?)$

哪一行应匹配不以一个或多个#开头的行,后跟一些内容,然后是我正在搜索的单词编号组合,最后是一些东西。

如果评论不是从行的开头开始,那么匹配部分行也许会很好。

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

我做错了什么?

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

编辑:我获得的新模式不会返回错误匹配,但会返回多行,其中包含myword 在该行之前的几行。而且我不确定它会返回所有比赛。

3 个答案:

答案 0 :(得分:3)

请注意[]是字符类。你不能在那里使用量词。它们就像. - 匹配那里给出的任何字符。然后可以量化点本身或character class

在您的示例中,[^(#+)]会匹配()+之外的所有内容,具体取决于风格(我猜) #\

所以你想要的是匹配一个以#以外的任何字符开头的行。 (我想。)

问题是#可能出现在不是注释的字符串中。 (关于不是从行开头开始的评论。)

答案 1 :(得分:2)

Re:评论不在字符串的开头。

要做到这一点正确(例如,不要错过任何有效的匹配)你几乎必须正确地解析文件的特定编程语言的语法,所以你不能这样做(很容易,甚至在所有)与RegEx。

如果不这样做,则可能会丢失在注释开始之外的上下文中使用的“#”之后的有效搜索命中 - 作为字符串"this is my #hash"之后几乎所有语言的通用示例。< / p>

在Perl中更糟糕的是,“#”也可以作为正则表达式分隔符出现,作为$#myArr(数组的最后一个元素的索引),或者 - 欢乐的快乐 - 作为一个有效字符识别名称!

答案 2 :(得分:0)

当然,如果您了解这些问题并仍想使用regexp来提取内容。这样的事情可能有用:

^[^\#].[^\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