perr中qr打印结果的含义

时间:2011-10-22 00:38:03

标签: regex perl

the documentation开始,我看到

$rex = qr/my.STRING/is;
print $rex; # prints (?si-xm:my.STRING)

但我不确定如何理解(?si-xm:...)。如果我在qr/quick|lazy/上打印,我会得到(?-xism:quick|lazy)。这也是(?-xism:...)的含义是什么?

谢谢!

3 个答案:

答案 0 :(得分:15)

perlre手册页中所述:

  

?:之间的任何字母都用作标记修饰符[...]

-之前的字母是正修饰符;那些之后是负面修饰语。因此,例如,(?-xism:quick|lazy)表示在括号内允许的空格和注释,括号内的部分区分大小写,点{{1 匹配换行符,.^ 匹配行开头和行尾。

答案 1 :(得分:11)

正如笔记所述,(?FLAGS:pattern)语法已经在perl 5.14.0中发生了变化,并且正则表达式的标准化也随之发生了变化。引用perlre

  

从Perl 5.14开始,在“?”之后立即出现“^”(插入符号或韵律重音符号)是一个相当于“d-imsx”的简写。标志(“d”除外)可以跟随插入符号覆盖它。但减号不合法。

d是5.14中一组新标志中的一个,它影响正则表达式如何受Unicode影响;默认情况下,d表示基本上像旧的Perl版本一样。)

通过添加(?^FLAGS:pattern)语法,正则表达式字符串化将更改为使用此语法,并且仅列出与默认值不同的标志。因此,qr/hello/字符串为(?^:hello)(以前为(?-xism:hello)),qr/hello/i字符串为(?^i:hello)(以前为(?i-xsm:hello))。

此更改的优点是,如果perl 5.16要添加新的q正则表达式修饰符(用于“在量子计算机上运行此匹配”),qr/hello/将不必更改为字符串化为(?d-xismq:hello) - 它将能够保持(?^:hello),因为它在5.14上。

答案 2 :(得分:0)

如果字母显示在/x的左侧,则代表/i/s/m-,如果缺少修饰符,该字母显示在-的右侧。

代码的目的是用于传输指定了哪些标志

>perl -E"$re = qr/./s;  say qq{a\nb} =~ /a${re}b/ ? 'match' : 'no match'"
match

>perl -E"$pat = '.';  say qq{a\nb} =~ /a${pat}b/ ? 'match' : 'no match'"
no match

>perl -E"$pat = '(?s-xim:.)';  say qq{a\nb} =~ /a${pat}b/ ? 'match' : 'no match'"
match

......哪些不是。

>perl -E"$re = qr/./;  say qq{a\nb} =~ /a${re}b/s ? 'match' : 'no match'"
no match

>perl -E"$pat = '.';  say qq{a\nb} =~ /a${pat}b/s ? 'match' : 'no match'"
match

>perl -E"$pat = '(?-xism:.)';  say qq{a\nb} =~ /a${pat}b/s ? 'match' : 'no match'"
no match

(?:...)记录在perlre