【问题标题】:What's the meaning of this perl regex expression?这个 perl 正则表达式的含义是什么?
【发布时间】:2013-09-04 12:41:35
【问题描述】:
the regex expression is as below:
if ($ftxt =~ m|/([^=]+)="(.+)"|o)
   {
    .....
   }

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

【问题讨论】:

  • 您对[^=] 的解释是错误的。正则表达式中的括号开始匹配的单个字符类,开头的^ 否定它。在括号内的其他地方,它表现为文字字符(许多其他字符在括号内失去其特殊含义)。如果没有括号,^= 将匹配行首的等号。

标签: regex perl


【解决方案1】:

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

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

或者

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

在这里使用不同于/ 的东西的好处是您不必转义斜杠,否则,您必须使用:

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

[或[/]]

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

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

至于最后一部分o,这是一个我到目前为止还没有遇到过的标志,所以稍微搜索一下就找到了this post,我引用:

/o 修饰符位于 perlop 文档中,而不是 perlre 文档中,因为它是一个类似引号的修饰符,而不是一个正则表达式修饰符。我一直觉得这很奇怪,但事实就是这样。

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

【讨论】:

    【解决方案2】:
    1. 一些正则表达式实现允许您使用除/ 之外的其他特殊字符作为分隔符。如果您需要在正则表达式本身中使用该特殊字符,这很有用,因为您不必转义它。 (/ 本身不是正则表达式语法中的特殊字符,但如果它用于宿主语言的正则表达式 literal 语法,则需要转义。)Perl's quote operators 上的文档提到了这一点.

    2. 这是教程级别的东西:方括号 ([abc]) 表示字符类 - 它表示“括号内的任何字符”。 (在我的示例中,它表示“abc。)在它们内部,^ 特殊字符具有不同的含义,它反转字符类。所以, [^=] 表示“任何字符除了 =”,[^=]+ 表示“一个或多个不是= 的字符”。


    引用Perl's RE syntax上的文档:

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

    【讨论】:

      【解决方案3】:

      它的目的是匹配表达式,以分别捕获键和值。假设您有一个类似height="30px" 的语句,并且您想要捕获height 属性名称及其值30px

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

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

      接下来是= 符号,您并不关心它。然后是包含该值的引号。所以你像"(.+)" 一样捕获它。 .+ 将继续贪婪地匹配每个字符,包括最后的"。但是随后它会发现它无法匹配正则表达式中最后的",所以它会回溯,放弃最后一个"捕获的正则表达式(.+),这样就留下了引号内的字符串被捕获在群里。现在您已准备好通过$1$2 访问键和值。很酷,不是吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 2011-04-20
        相关资源
        最近更新 更多