1

这些是什么意思?

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;
4

3 回答 3

5

=~is not或的 RHS 时m//,隐含匹配运算符 ( )。s///tr///m//

$identity =~ $pattern;

是相同的

$identity =~ /$pattern/;

它将模式或预编译的正则表达式$pattern( qr//) 与$identity.

于 2013-07-04T11:26:47.420 回答
4

绑定运算符=~将正则表达式应用于字符串变量。这记录在perldoc perlop

\Q ... \E转义序列是一种引用元字符的方式(也记录在 perlop 中)。但是,它允许变量插值,这就是为什么你可以在这里使用它$1$2。但是,在正则表达式中使用这些变量有些不确定,因为它们本身是在正则表达式中使用捕获期间定义的。

字符类括号[ ... ]定义了它将匹配的字符范围。它后面的量词*意味着特定的括号必须匹配零次或多次。破折号表示范围,例如a-z表示“从 a 到 z”。转义的破折号\-意味着文字破折号。

^$(末尾的美元符号)分别表示锚点、字符串的开头和结尾。最后的修饰符i意味着匹配不区分大小写。

在您的示例中,$identity是一个可能包含字符串的变量(或者它包含的任何内容都将转换为字符串)。

于 2013-07-04T11:18:06.523 回答
1

perlre文档是你的朋友。搜索不熟悉的正则表达式结构。

下面是一个详细的解释,但是我想知道使用诸如Text::Balanced之类的模块是否是一种更好的方法。


第一个模式匹配可能为空的分隔字符串,分隔符在$1and$2中,直到运行时我们才知道。说$1is($2is ),那么第一个模式匹配形式的字符串

  • ()
  • (a)
  • (9)
  • (abcABC_012-)
  • 等等……</li>

第二个模式匹配终止符所在的终止字符串$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
}
于 2013-07-04T11:29:48.197 回答