这些qr {}正则表达式意味着什么?

时间:2013-07-04 11:08:42

标签: regex perl

这些是什么意思?

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;

3 个答案:

答案 0 :(得分:5)

=~的RHS不是m//s///tr///时,会隐含匹配运算符(m//)。

$identity =~ $pattern;

相同
$identity =~ /$pattern/;

它将模式或预编译的正则表达式$patternqr//)与$identity的值进行匹配。

答案 1 :(得分:4)

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

中有记录

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

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

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

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

答案 2 :(得分:1)

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

下面有一个详细的解释,但它太毛茸茸了,我想知道使用像Text::Balanced这样的模块是否是一种优越的方法。


第一个模式可能匹配空分隔字符串,分隔符位于$1$2中,直到运行时我们才知道。假设$1($2),则第一个模式匹配表单的字符串

  • ()
  • (a)
  • (9)
  • (abcABC_012-)
  • 等......

第二个模式匹配已终止的字符串,其中终结符位于$1中 - 直到运行时才知道。假设终结符为],则第二个模式匹配表单

的字符串
  • ]
  • a]
  • Aa9a_9]

在模式周围使用\Q...\E会删除内部字符中的任何特殊正则表达式含义,如perlop中所述:

  

对于正则表达式运算符(qr//m//s///)的模式,在处理插值之后但在处理转义之前应用\Q的引用。这允许模式按字面匹配($@除外)。例如,以下匹配:

'\s\t' =~ /\Q\s\t/
     

由于$@会触发插值,因此您需要使用类似/\Quser\E\@\Qhost/的内容来逐字匹配。

你的问题中的模式想要触发插值但是希望任何正则表达式元字符具有特殊含义,如上面的圆括号和方括号所示字面上匹配。

其他部分:

  • 外接括号分隔字符类。例如,[a-zA-Z0-9_\-]匹配任何单个字符,即大小写A到Z(但没有重音或其他附加内容),0到9,下划线或连字符。请注意,连字符在末尾被转义以强调它与文字连字符相匹配而不指定范围的一部分。

  • *量词表示匹配前面一个子模式的零个或多个。在你的问题的例子中,明星重复了角色类。

  • 模式用^$括起来,这意味着整个字符串必须匹配而不是某些子字符串才能成功。

  • 最后的i,在结束大括号之后,是一个正则表达式开关,使模式不区分大小写。正如TLP在下面的评论中指出的那样,这使分隔符或终止符匹配而不考虑它们是否包含字母的情况。

表达式$identity =~ $pattern测试存储在$pattern(使用$pattern = qr{...}创建)中的已编译正则表达式是否与$identity中的文本匹配。如上所述,可能正在评估其在$1$2等中存储捕获组的副作用。这是一个红旗。 从不无条件地使用$1和朋友,而是写

if ($identity =~ $pattern) {
  print $1, "\n";  # for example
}