regex - Perl 如何匹配 verilog 文件的注释 "//"?

标签 regex perl

我找到了一种方法,但不明白原理:

#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/

相关文章:

Perl -e 字段替换

Perl,使用两个不同的哈希表生成新数据(新哈希)

perl - 如何在 Perl 中访问存储在散列中的数组元素?

c++ - 使用 C++ 在 Evil Hangman 游戏中存储和处理词族

ruby - 用于 Sublime Text 的正则表达式字符串,用于在两个逗号之间查找电子邮件地址

javascript 凯撒密码算法

mysql - 如何向我的 MySQL 数据库中插入 100 万个条目?

perl - 安装 perl DBD :Pg on Mac

c++ - 在 C++ 中使用定界符从文件中提取单词(由无符号字符组成)

regex - Vim-substitute 命令插入重复项