我使用 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 源代码。所以在这种情况下坚持逃跑。