这个perl正则表达式的含义是什么?

时间:2013-09-04 12:41:36

标签: regex perl

the regex expression is as below:
if ($ftxt =~ m|/([^=]+)="(.+)"|o)
   {
    .....
   }

这个正则表达式似乎与许多其他正则表达式不同。让我困惑的是“|” ,大多数正则表达式使用“/”而不是“|”。而且,group([^ =] +)也让我感到困惑。我知道[^ =]的意思是“字符串的开头”或“=”,但是重复'^'一次或多次是什么意思? ,怎么解释这个?

3 个答案:

答案 0 :(得分:6)

您可以使用不同的分隔符代替/。例如,您可以使用:

m#/([^=]+)="(.+)"#o

或者

m~/([^=]+)="(.+)"~o

使用与/不同的东西的优点是你不必转义斜杠,否则你必须使用:

m/\/([^=]+)="(.+)"/o
  ^

[或[/]]

([^=]+)是一个捕获组,在内部,您有[^=]+[^=]是一个否定的类,将匹配任何不是=的字符。

^在字符类的开头表现不同,与字符类之外的^不同,这意味着“行首”。

至于最后一部分o,这是一个我到目前为止还没有遇到过的旗帜,所以我引用了this post,我引用了一下:

  

/o修饰符位于perlop文档中,而不是perlre文档中,因为它是类似引号的修饰符而不是正则表达式修饰符。这对我来说总是很奇怪,但事实就是如此。

     

在Perl 5.6之前,即使变量没有改变,Perl也会重新编译正则表达式。你不需要那样做了。尽管对变量进行了进一步更改,您仍可以使用/o编译正则表达式,但正如其他答案所指出的那样,qr//对此更好。

答案 1 :(得分:4)

  1. 某些regexp实现允许您使用除/之外的其他特殊字符作为分隔符。如果您需要在正则表达式中使用该特殊字符,这很有用,因为您不必转义它。 (本身/本身并不是regexp语法中的特殊字符,但如果它在宿主语言的regexp literal 语法中使用,则需要转义。){{3上的文档提到这个。

  2. 这是教程级别的东西:方括号([abc])表示字符类 - 它表示“括号内的任何字符”。 (在我的示例中,它表示“abc。”在其中,^特殊字符具有不同的含义, inverts < / em>字符类。因此,[^=]表示“除 =之外的任何字符”,[^=]+表示“不是{的一个或多个字符” {1}}”。


  3. Perl's quote operators上引用文档:

      

    您可以通过在=中包含一个字符列表来指定字符类,该列表将匹配列表中的任何字符。如果“[”之后的第一个字符是“^”,则该类匹配列表中没有的任何字符。

答案 2 :(得分:2)

它意味着匹配方程式表达式,分别捕获键和值。想象一下,您有height="30px"之类的语句,并希望捕获height属性名称及其值30px

所以你有m|/([^=]+)="(.+)"|

密钥应该是遇到=之前的所有内容。所以[^=]抓住了它。当^用作[]括号内的第一个字符时,=是一个否定元字符。这意味着它将匹配除/之外的任何字符,这是您想要的。 \(可能是一个错误,如果你需要捕获组,你不应该使用它,或者如果它确实是有意的,它意味着字面上匹配一个开括号。由于它是一个特殊字符,因此需要进行转义,这就是([^=]+)的原因。如果你想抓住这个小组,它应该是=

接下来是"(.+)"标志,您不关心。然后是包含值的引号。所以你像.+一样抓住它。 "将继续贪婪地匹配每个角色,包括最终的"。但是它会发现它与正则表达式中的最终"不匹配,因此它会回溯,放弃最后(.+)捕获的正则表达式$1,这样就会留下字符串在组中捕获的引号内。现在,您已准备好通过$2和{{1}}访问密钥和值。很酷,不是吗?