我找到了一种方法,但不明白原理:
#remove lines starting with //
$file =~ s/(?<=\n)[ \t]*?\/\/.*?\n//sg;
(?<=\n)[ \t]*?
怎么样?工作?
最佳答案
关键部分是 lookbehind (?<=...)
。这是一个零宽度断言,这意味着它不会消耗其匹配项 - 它仅断言内部给出的模式确实在字符串中,就在其后面的模式之前。 p>
所以(?<=\n)[ \t]
匹配空格或制表符,[ \t]
,前面有一个换行符。使用量词,[ \t]*
,它匹配空格或制表符任意次(可能为零)。然后我们有//
(每个都由 \
转义)。然后它会匹配任何字符任意次数,直到第一个换行符 .*?\n
。
这里?
使.*
非贪婪,以便它停止在以下模式的第一个匹配处。
这也可以通过其他方式完成。
$file =~ s{ ^ \s* // .*? \n }{}gmx
修饰符m
制作 anchor ^
和$
(此处未使用)匹配每行的开头和结尾。我用{}{}
作为分隔符,这样我就不必转义 /
。修改器x
允许在内部使用空格(以及注释和换行符)以提高可读性。
您也可以通过 split 来完成- 通过换行符转换字符串并通过 grep 传递行
my $new_file = join '\n', grep { not m|^\s*//.*| } split /\n/, $file;
split
返回行列表,这是 grep
的输入,它传递 block 中代码计算结果为 true 的内容。如果您希望再次拥有多行字符串,则它返回的列表将被连接回去。
如果您想要删除 join '\n'
行并分配给一个数组。
grep
中的正则表达式block 现在要简单得多,但与之前的正则表达式相比,整个事情可能会让人大吃一惊。然而,这种方法可以将困难的工作变成简单的工作:而不是去寻找怪物主正则表达式,而是打破字符串并轻松处理各个部分。
关于regex - Perl 如何匹配 verilog 文件的注释 "//"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838086/