在Perl正则表达式中逃脱@

Mat*_*ios 5 regex perl

我使用perl来匹配bash脚本中的正则表达式的密码.

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

这有效:

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

虽然这永远不匹配:

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

你可以注意到,它有效,因为我逃脱了@符号.我从来没有在其他编程语言中看到过这样的东西,经过一个多小时的坚持,我发现原因只是偶然.

所以,我的问题是,这是怎么回事?为什么我需要逃避像@这样的奇怪角色?

blh*_*ing 11

这是因为@在perl中表示一个数组变量,所以如果没有转义它,后面的内容将被解释为一个数组变量.

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

  • 您可以使用单引号文字,而不使用单引号:`q {Bomba @ 2071}` (6认同)