在介绍修饰符之前,首先介绍一下在Perl中的两个基本函数:
match( $string, $pattern );
subst( $string, $pattern, $replacement );
即匹配和替换,缩写为m//
和s///
(或s###
),对应到SAS中的函数就是PRXMATCH和PRXCHANGE,即m/PATTERN/
和s/PATTERN/REPLACEMENT/
(或s#PATTERN#REPLACEMENT#
)。注意其中的字母m(表示开始匹配的操作)可以省略而字母s不能省略。模式修饰词也称为选项,是指放在m//
和s///
最后一个分隔符后的一个字母,例如字母/o/i/s/m/g
。由于SAS并没有包含整个Perl语言,所以SAS中只支持部分的模式修饰词,下面简单介绍一下两个常用的修饰符:
/o
,只编译表达式一次,这样可提高效率。如果我们将表达式写在函数PRXPARSE中,如下所示:
这种写法SAS只编译表达式一次,等同于下面这种写法:re=prxparse('/(.+?)\s+(\d+)/');
pattern='/(.+?)\s+(\d+)/o'; re=prxparse(pattern);
/i
,忽略字母大小写,如下面的表达式的第一个组,可以成功匹配字符串PERL也可以匹配字符串Perl。pattern='/(Perl)\s+(\d+)/io'; re=prxparse(pattern);
上面有提到另一种替换的操作符:s###
(s#PATTERN#REPLACEMENT#
),下面介绍一下这个操作符的用处。我们知道在表达式中如果要匹配一些元字符的时候,如/, (, .
,则需要在元字符前面加一个转义符\来屏蔽元字符的特殊含义以达到匹配元字符本身的目的。而当PATTERN
或REPLACEMENT
中含有多个元字符,则需要写多个转义符\
,这样就会有点麻烦。所以这种情况就可用s###
(s#PATTERN#REPLACEMENT#
),因为在这种操作符中可以不用使用转义符。如下例:
path=prxchange("s/.*\/(.*)\/\w*\.jpg/\/home\/cn\/picture\/$1\/Cheshire_cat.jpg/", 1, "http://www.xianhuazeng.com/cnuploads/2015/Cheshire_cat.jpg");
path=prxchange("s#.*/(.*)/\w*.jpg#/home/cn/picture/$1/Cheshire_cat.jpg#", 1, "http://www.xianhuazeng.com/cnuploads/2015/Cheshire_cat.jpg");