【问题标题】:Why is the @ symbol escaped in this Perl regular expression?为什么这个 Perl 正则表达式中的 @ 符号被转义了?
【发布时间】:2011-08-01 22:45:19
【问题描述】:

我目前正在研究 Perls RegExps,我认为总体上理解它。我认为,我也掌握了转义字符,即测试反斜杠,用 m/\/ 表示,因为需要继续购买 \ 字符,以便在这种情况下告诉 perl 搜索它,就像它通常的含义一样.

我对下面的代码不理解的是,这种模式匹配以及为什么在测试带有 @ 符号的电子邮件地址时使用 (\) (在 if 语句表达式中)。我不知道 @ 是一个需要转义的特殊字符还是我错过了什么?。

#!/usr/bin/perl

EMAIL:
{
print("Please enter your email address: ");
$email = <STDIN>;
  if ($email !~ /\@/)
  {
    print("Invalid email address.\n");
    redo EMAIL;
  }
  else
  {
    print("That could be a valid email address.");
  }
}

【问题讨论】:

  • 看来/@//\@/ 意思一样。但请注意:/@x//\@x/ 非常不同。
  • 哦,好吧,我还有更多的阅读要做,但我会记住的。非常感谢你的协助!!。我已尽我所能尝试解决它,不问,不问,问清酒或懒惰,但我一直在挣扎。再次感谢
  • 嘿,如果你想匹配对@x的引用,你会怎么做? :) 将它分配给一个标量,不要再这么聪明了!
  • 就个人而言,我只是转义正则表达式中不是数字或字母的所有内容。我猜是偏执狂。

标签: regex perl escaping


【解决方案1】:

它可能被转义以避免被解释为数组印记。这不是绝对必要的,但这是一个很难改掉的习惯。

例子:

$e = "\@foo";
if ($e =~ /@/) {
  print "yay\n";
}

产量:

yay

同理:

$e = "foo";
if ($e =~ m@foo@) {
  print "yay\n";
}

【讨论】:

  • 是的,我听说过使用 // 或 ##,但不知道 @@ 也可以。杰出的。谢谢,很有帮助。
  • @Mike Thornley 您甚至可以匹配大括号,例如:m{...}——我认为这在“引用和引用式”下的 perlop 中有所涵盖。如果不存在,则在 perlsyn 中。 @ 的“问题”是正则表达式文字属于“内插引号”类别,除非在 m'...' 等形式中。
  • @Mike Ahh: 来自 perlop 的The Gory Details Of Parsing Quoted Constructs 涵盖了一点 ;-)
  • @Mike Thomley:您可以使用任何字符作为分隔符。大括号/方括号需要匹配(而不是重复),并且字母/数字需要在它们和引用运算符(也可能是字符串)之间有一个空格。就个人而言,我建议坚持使用 / 或 !或 # 或某种括号。
  • 使用qw 类似引号的运算符的一个好方法是qw wq qw。这将为您提供两个字符串的列表,qq。看,wqw 的分隔符,所以它通常写成qw /q q/
【解决方案2】:

@ 不是正则表达式的保留字符,但它是 perl 的(它是数组符号)

【讨论】:

    【解决方案3】:

    在 Perl 中,您可以转义任何潜在的正则表达式元字符并保证它是文字。

    另外,对于@,它是数组印记,所以如果它有可能被误认为是@/ 变量,那么值得转义。

    【讨论】:

      【解决方案4】:

      在 Perl 中,数组被插入到双引号字符串和正则表达式中,特殊变量 $"(默认为空格字符)位于每个元素之间:

      my @array = ('a', 'b', 'c');
      print "@array";  # prints "a b c"
      print "a b c" =~ /@array/;  # prints "1"
      

      我很少使用这个功能,但偶尔会派上用场,例如:

      sub line_matches_words {
          my ($line, @words) = @_;
          local $" = '[ \t]+';
          return $line =~ /^[ \t]*@words[ \t]*$/;
      }
      

      【讨论】:

        猜你喜欢
        • 2010-09-19
        • 2019-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        相关资源
        最近更新 更多