regex - 在 Perl 正则表达式中转义 @

标签 regex perl

我使用 perl 将密码与 bash 脚本中的正则表达式匹配。

在测试密码的正则表达式时,我遇到了这个问题:

这有效:

perl -e 'if ( "Bomba\@2071"  =~ /^(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8,}$/ ) { print 1; } '

虽然这永远不会匹配:
perl -e 'if ( "Bomba@2071"  =~ /^(?=.*[A-Z])(?=.*[!@#$&*])(?=.*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8,}$/ ) { print 1; } '

正如您所注意到的,它之所以有效,是因为我转义了 @ 符号。我从未在其他编程语言中看到过这样的事情,在坚持了一个多小时之后,我偶然找到了原因。

所以,我的问题是,这里发生了什么?为什么我需要转义像@ 这样的奇怪字符?

最佳答案

这是因为 @在 perl 中表示 array variable ,所以不转义它下面的内容将被解释为数组变量。

除了逃避@ , 您也可以使用单引号代替双引号,例如'Bomba@2071' ,这样字符串就不会被解释,尽管在这种情况下它会产生一个新问题,因为您在 shell 命令中使用单引号来引用整个 perl 源。所以在这种情况下坚持逃避。

关于regex - 在 Perl 正则表达式中转义 @,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51738106/

相关文章:

php - 逗号分隔列表的子字符串的正则表达式

perl - 应该使用CGI.pm的header方法来输出Content-Type header吗?

perl - 在 perl 中使用 WWW::YouTube::Download 时出错

c# - 如何使用 Regex 提取带有续行的文本?

regex - 使用 bash 用空格替换连字符

java - 单词末尾加号的正则表达式

regex - 匹配后出现 grep

perl - 将文件句柄与 IO::Select::can_read() 返回的 glob 进行比较

perl - 如何对值为数组引用的 Perl 哈希进行排序?

perl - 有没有一种 CPAN 方法来解析随机命令行选项?