在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 中的 @ 表示数组变量,因此如果不转义它,下面的内容将被解释为数组变量。

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

最新更新