【问题标题】:Escape @ in Perl regex在 Perl 正则表达式中转义 @
【发布时间】:2018-08-08 03:09:33
【问题描述】:

我正在使用 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; } '

如您所见,它之所以有效,是因为我转义了 @ 符号。我从来没有在其他编程语言中看到过这样的事情,在被这个问题困扰了一个多小时后,我偶然发现了原因。

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

【问题讨论】:

  • use strict;use warnings; 中的任何一个都会告诉您问题所在。

标签: regex perl


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您的回复!
  • 您可以使用单引号文字而不实际使用单引号:q{Bomba@2071}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
相关资源
最近更新 更多