很难理解正则表达式

时间:2014-07-23 03:56:26

标签: regex perl

经过一些研究后,我仍然无法完全理解下面的Perl代码。根据我对该行的理解

if ($fileName =~ /^.*\.gz\z/si)

如果$fileName等于任何.gz,则该计划会执行,$fileName将等于$inputname。我是对的吗?

if ($fileName =~  /^.*\.gz\z/si) { 
    $filename = $inputname;
}
  1. /^. - 这是否意味着?

  2. *\ - 这是否意味着所有?

  3. \z - z在Perl正则表达式中有意义吗?

  4. /si - 我不知道这个

  5. =~ - 这是什么意思?

  6. 我认为我的问题也是错的?这个问题对你来说可能很简单,但对我来说很难。我希望你明白。

2 个答案:

答案 0 :(得分:5)

正则表达式本身是//之间的部分。

  • ^表示:字符串的开头(所以之前没有字符)。

  • .*表示:一定数量的任何字符(.表示任何字符,*是量词,表示介于0和无穷大之间。)

  • \.gz表示:字面点,后跟gz(.需要转义,即前面加一个反斜杠\表示一个字面点。 / p>

  • \z表示:“字符串结束”。

选项位于结束斜杠之后。(修饰符

  • i表示不区分大小写。

  • s启用DOTALL模式。也就是说,它使.匹配任何字符,甚至是换行符,通常它不匹配。

最后:

  • =~表示它将正则表达式与变量$filename匹配。

  • 总之,它检查变量$filename以查看它是否包含具有.gz(不区分大小写)扩展名的文件的名称。

参考链接:

http://perldoc.perl.org/perlre.html

http://perldoc.perl.org/perlrebackslash.html

答案 1 :(得分:3)

基本上,正则表达式^.*\.gz\z/si匹配任何以.gz结尾的字符串(不区分大小写)...即使字符串长达数行!

(我建议删除s标志 - 请参阅下面的含义。)

正则表达式由/分隔。您可以使用其他分隔符,例如!

=~测试正则表达式是否能够匹配字符串。

用令牌解释正则表达式

  • 在字符串^
  • 的开头处断言位置
  • 匹配任何单个字符.*
    • 在零和无限次之间,尽可能多次,根据需要回馈(贪婪)*
  • 将字符“。”字面匹配\.
  • 字面匹配字符串“gz”(不区分大小写)gz
  • 断言字符串\z
  • 最后的位置

i标志使其不区分大小写。 s标志激活DOTALL模式,允许点跨线匹配。