包含非常相似的正则表达式匹配的if语句有什么作用?

时间:2009-11-11 21:38:58

标签: regex perl

这一系列的Perl是什么意思?

if (/ile.*= (\d*)/ || /ile.*=(\d*)/ ) {

我对“/ ile”的含义特别感兴趣,为什么||的两面都是相同的。

4 个答案:

答案 0 :(得分:9)

语法/.../包含regular expression||的两边略有不同 - 第二个在等号后没有空格。

第一个/.../解码为“匹配字母'i,l,e'然后任意字符(.)任意次(*),然后等于({ {1}}),然后是一个空格,然后有一个抓取(括号),抓取零个或多个数字(=)。

匹配与Perl变量无关,因此它将与默认标量\d*相对。

答案 1 :(得分:7)

您可以将其重写为

if (/ile.*= ?(\d*)/) {

使用YAPE::Regex::Explain了解给定模式的匹配情况。

#!/usr/bin/perl

use strict;
use warnings;

use YAPE::Regex::Explain;

print YAPE::Regex::Explain->new(qr/ile.*= ?(\d*)/)->explain;

输出:

The regular expression:

(?-imsx:ile.*= ?(\d*))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ile                      'ile'
----------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
----------------------------------------------------------------------
  =                        '='
----------------------------------------------------------------------
   ?                       ' ' (optional (matching the most amount
                           possible))
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    \d*                      digits (0-9) (0 or more times (matching
                             the most amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

答案 2 :(得分:4)

这可能是寻找一个看起来像其中之一的字符串的粗暴方式:

fileXXX=1234657
fileYYY= 123648

...'ile'字面上匹配这三个字符,||的两边不完全相同,有一个版本在=之后有一个空格而一个没有

答案 3 :(得分:2)

在此上下文中,“/”字符不作为数学除法运算符或某种前缀(如Windows命令行选项)。相反,“/”是用于包含正则表达式的常用引用字符。

这对斜线之间的所有东西形成一个正则表达式,并不表示任何可执行代码,这使我们认为是另一个混​​乱的来源,认为那里的“=”是某种赋值或等式运算符。在正则表达式中,它只是一个普通的字符,就像空格字符一样。空间是重要的,一个存在或不存在意味着这两个正则表达式不相同。如Sinan的答案所示,它们可以合并为一个正则表达式,使用“?”正则表达式运算符。