2012-10-05 67 views
2

我需要一个Perl正则表达式来删除行尾注释。我觉得我已经为此搜索并找不到正确的东西。下面是详细信息:删除行尾注释除非报价

EOL注释用英镑符号(#)表示

任何东西都可以用竖线被引用(|)

所以下面有一个评论:

foo bar #baz 

但以下不会:

foo |quoted###with bars| 

下面有一个COMME NT和包含批注文字报价:

foo |quoted###with bars| #comment here 

我想的第一件事就是s/#(?=[^|]*$).*$//,不幸的是去除了引述英镑。不工作的下一件事就是/#(?=[^|]*$).*$//,因为它没有对多报价,如下所示:

foo |quote begins here ##still going 
     ##and it's still going| #this is a quote, though. 

我觉得我可能能够在perlfaq6从正则表达式的C/C++的意见搜集的东西,但对于我来说,抓取我需要的东西太复杂了(不需要多行注释;)。

任何人都可以提供一个正则表达式来移除EOL注释但忽略引用的注释字符吗?

回答

2

一种方法:

s/(\|[^|]*\|)|#.*/$1||''/eg

这将替换|...|(包括|...#...|)与自身,与#...什么也没有。

+0

几乎...不包括多线事情。 –

+0

@NateGlenn:当然可以;你尝试过吗?当我在'abc | def#ghi'上使用它时,再加上一个换行符,再加上'klm | nop#qrs',它只会剥离'#qrs',因为'#ghi'在多行内| | | '片段。你看到不同的东西吗? – ruakh

+0

就是你!谢谢。 –