从the documentation开始,我看到
$rex = qr/my.STRING/is;
print $rex; # prints (?si-xm:my.STRING)
但我不确定如何理解(?si-xm:...)
。如果我在qr/quick|lazy/
上打印,我会得到(?-xism:quick|lazy)
。这也是(?-xism:...)
的含义是什么?
谢谢!
答案 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。