the regex expression is as below:
if ($ftxt =~ m|/([^=]+)="(.+)"|o)
{
.....
}
这个正则表达式似乎与许多其他正则表达式不同。让我感到困惑的是“|” ,大多数正则表达式使用“/”而不是“|”。而且,组 ([^=]+) 也让我感到困惑。我知道 [^=] 表示“字符串的开头”或“=”,但重复 '^' 一次或多次是什么意思?,这怎么解释?
您可以使用不同的分隔符代替/
. 例如,您可以使用:
m#/([^=]+)="(.+)"#o
或者
m~/([^=]+)="(.+)"~o
在这里使用不同的东西的好处/
是你不必逃避斜线,否则,你必须使用:
m/\/([^=]+)="(.+)"/o
^
[或[/]
]
([^=]+)
是一个捕获组,在里面,你有[^=]+
. [^=]
是一个否定类,将匹配任何不是=
.
^
在字符类的开头表现不同,并且与字符类^
之外的行为不同,这意味着“行首”。
至于最后一部分o
,这是一个我到目前为止还没有遇到过的标志,所以稍微搜索一下就把我带到了这篇文章中,我引用:
该
/o
修饰符位于perlop文档而不是perlre文档中,因为它是一个类似于引号的修饰符而不是正则表达式修饰符。这对我来说总是很奇怪,但事实就是如此。在 Perl 5.6 之前,即使变量没有改变,Perl 也会重新编译正则表达式。你不再需要这样做了。
/o
尽管对变量进行了进一步更改,但您可以使用一次编译正则表达式,但正如其他答案所指出的那样,qr//
这样做更好。
一些正则表达式实现允许您使用除/
分隔符之外的其他特殊字符。如果您需要在正则表达式本身中使用该特殊字符,这很有用,因为您不必转义它。(本身/
不是正则表达式语法中的特殊字符,但如果它用于宿主语言的正则表达式文字语法中,则需要转义。) Perl 的引号运算符的文档提到了这一点。
这是教程级别的东西:方括号 ( [abc]
) 表示一个字符类 - 它表示“括号内的任何字符”。(在我的示例中,它的意思是“要么a
或b
要么c
。)在它们内部,^
特殊字符具有不同的含义,它反转了字符类。因此,表示“除[^=]
”之外的任何字符,并表示“一个或多个不是的字符”。 =
[^=]+
=
引用Perl 的 RE 语法的文档:
您可以指定一个字符类,通过在 中包含一个字符列表
[]
,它将匹配列表中的任何字符。如果“[”之后的第一个字符是“^”,则该类匹配任何不在列表中的字符。
它旨在匹配等式,如表达式,分别捕获键和值。想象一下,您有一个类似 的语句height="30px"
,并且您想要捕获height
属性名称以及它的值30px
。
所以你有m|/([^=]+)="(.+)"|
.
密钥应该=
是遇到之前的所有内容。所以[^=]
捕捉它。当^
用作[]
括号内的第一个字符时,它是一个否定元字符。这意味着它将匹配除 之外的任何字符=
,这是您想要的。这/
可能是一个错误,如果你需要捕获组,你不应该使用它,或者如果它确实是有意的,它意味着从字面上匹配一个左括号。既然是特殊字符,就需要转义,这就是为什么\(
. 如果您的意思是捕获该组,则应该是([^=]+)
.
接下来是=
你不关心的标志。然后是包含该值的引号。所以你像捕获它一样"(.+)"
。将.+
继续贪婪地匹配每个字符,包括 final "
。但是随后它会发现它无法匹配"
正则表达式中的final,因此它会回溯,放弃最后捕获"
的正则表达式(.+)
,从而将引号内的字符串留在组中要捕获的字符串。现在您已准备好通过$1
and访问键和值$2
。酷,不是吗?