这些是什么意思?
qr{^\Q$1\E[a-zA-Z0-9_\-]*\Q$2\E$}i
qr{^[a-zA-Z0-9_\-]*\Q$1\E$}i
如果$pattern
是 Perl 正则表达式,$identity
下面的代码是什么?
$identity =~ $pattern;
当=~
is not或的 RHS 时m//
,隐含匹配运算符 ( )。s///
tr///
m//
$identity =~ $pattern;
是相同的
$identity =~ /$pattern/;
它将模式或预编译的正则表达式$pattern
( qr//
) 与$identity
.
绑定运算符=~
将正则表达式应用于字符串变量。这记录在perldoc perlop
\Q ... \E
转义序列是一种引用元字符的方式(也记录在 perlop 中)。但是,它允许变量插值,这就是为什么你可以在这里使用它$1
和$2
。但是,在正则表达式中使用这些变量有些不确定,因为它们本身是在正则表达式中使用捕获期间定义的。
字符类括号[ ... ]
定义了它将匹配的字符范围。它后面的量词*
意味着特定的括号必须匹配零次或多次。破折号表示范围,例如a-z
表示“从 a 到 z”。转义的破折号\-
意味着文字破折号。
^
和$
(末尾的美元符号)分别表示锚点、字符串的开头和结尾。最后的修饰符i
意味着匹配不区分大小写。
在您的示例中,$identity
是一个可能包含字符串的变量(或者它包含的任何内容都将转换为字符串)。
perlre文档是你的朋友。搜索不熟悉的正则表达式结构。
下面是一个详细的解释,但是我想知道使用诸如Text::Balanced之类的模块是否是一种更好的方法。
第一个模式匹配可能为空的分隔字符串,分隔符在$1
and$2
中,直到运行时我们才知道。说$1
is(
和$2
is )
,那么第一个模式匹配形式的字符串
()
(a)
(9)
(abcABC_012-)
第二个模式匹配终止符所在的终止字符串$1
——直到运行时才知道。假设终止符是]
,那么第二个模式匹配形式为
]
a]
Aa9a_9]
在模式周围使用会从内部字符\Q...\E
中删除任何特殊的正则表达式含义,如perlop中所述:
对于正则表达式运算符 (
qr//
,m//
和s///
) 的模式,引用 from\Q
在处理插值之后但在处理转义之前应用。这允许模式在字面上匹配(除了$
and@
)。例如,以下匹配:'\s\t' =~ /\Q\s\t/
因为
$
或@
触发插值,你需要使用类似的东西/\Quser\E\@\Qhost/
来匹配它们。
您问题中的模式确实希望触发插值,但不希望任何正则表达式元字符具有特殊含义,如上面的括号和方括号旨在逐字匹配。
其他部分:
外界括号界定一个字符类。例如,[a-zA-Z0-9_\-]
匹配大写或小写字母 A 到 Z(但没有重音符号或其他附加字符)、零到九、下划线或连字符的任何单个字符。请注意,连字符在末尾被转义以强调它与文字连字符匹配,而不是指定范围的一部分。
*
量词意味着匹配零个或多个前面的子模式。在您问题的示例中,星号重复字符类。
这些模式用^
and括起来$
,这意味着必须匹配整个字符串而不是某个子字符串才能成功。
最后i
,在右花括号之后,是一个使模式不区分大小写的正则表达式开关。正如 TLP 在下面的评论中有用地指出的那样,这使得分隔符或终止符匹配而不考虑大小写是否包含字母。
该表达式测试存储在(使用创建)中的$identity =~ $pattern
已编译正则表达式是否与中的文本匹配。如上所述,它可能会因其将捕获组存储在、等中的副作用而受到评估。这是一个危险信号。永远不要无条件使用和朋友,而是写$pattern
$pattern = qr{...}
$identity
$1
$2
$1
if ($identity =~ $pattern) {
print $1, "\n"; # for example
}