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

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

4

3 回答 3

6

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

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

或者

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

在这里使用不同的东西的好处/是你不必逃避斜线,否则,你必须使用:

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

[或[/]]

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

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

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

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

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

于 2013-09-04T12:45:49.003 回答
4
  1. 一些正则表达式实现允许您使用除/分隔符之外的其他特殊字符。如果您需要在正则表达式本身中使用该特殊字符,这很有用,因为您不必转义它。(本身/不是正则表达式语法中的特殊字符,但如果它用于宿主语言的正则表达式文字语法中,则需要转义。) Perl 的引号运算符的文档提到了这一点。

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


引用Perl 的 RE 语法的文档:

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

于 2013-09-04T12:47:48.153 回答
2

它旨在匹配等式,如表达式,分别捕获键和值。想象一下,您有一个类似 的语句height="30px",并且您想要捕获height属性名称以及它的值30px

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

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

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

于 2013-09-04T12:54:01.977 回答