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