我遇到了使用正则表达式语法的麻烦。
我希望匹配某个单词后跟一个数字的所有匹配项,但排除被评论的行。
评论为(多个)#
或##
或###
...
示例:
#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
和在该行之前的几行。而且我不确定它会返回所有比赛。
答案 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