SAS:Tables of Perl Regular Expression (PRX) Metacharacters:prxparse,prxmatch

data ss;
set dd;
if _n_=1 then ret=prxparse("/abc/");
retain ret;
position=prxmatch(ret,string);
run;
prxparse只能和其他prx函数一起使用。Position返回string中“abc”的位置。固定用法。
(find查找确定的字符,prxparse可以用来匹配查找系列字符,或者说是一个字符串的模版)
1、 Prxparse(”/\d\d\d/”)寻找任意的三个数字,这里要注意的是关键字必须用{“//”}圈起来。
控制字符前面都要加\,具体字符不需要加\,待查找字符串用“/ /”括起来。
2、 Prxparse(”/\d+/”)寻找一个以上的数字,可以是1个也可以是100个
数字多个如果简写,使用“+”。
3、 Prxparse(”/\w\w\w* /”)寻找两个以及两个以上的字符然后以空格分隔,*号后面有个空格。譬如寻找啦啦 或者啦啦啦 就可以这么写Prxparse(”/\啦\啦\啦* /”)
*表示两个及两个以上的,*后面的空格表示查找到的字符串应当包括后面的一个空格

4、 Prxparse(”/\w\w? + /”)寻找一个或者两个字符以一个空格或者多个空格分隔。?后面是有空格的哈。这个总结一下,就是字符多的用*号,空格和数字多个用+号。
?表示一个或两个字符,?后面的空格表示查找到的字符串应当包括后面的空格,+表示可以有多个空格
5、 Prxparse(”/(\w\w)  +(\d)  +/”)寻找一个两个字符之间与一个数字相隔一个或者多个空格的字符。注意,在正则式中,空格也算的,所以写的时候要小心。那这里举个栗子,就是譬如 “我是啦啦  2 ”那么就会找到:“啦啦 2 ”。
6、 *: cat* matches “cat”,”cats”,”catanddog”;c(at)* matches “c”,”cat”,”catatat”;
查找*前面的子表达式零次或更多次。
+:查找+前面的子表达式一次或更多次。
?:查找?前面的子表达式零次或一次。know? Matches “kno” and “know”。
.:代表一个具体的字符,例如r.n matches “run” or “ran”。
\d 代表任一0-9的数字
\D 代表任一非0-9的字符
^ 代表一个字符串的开头,例如 ^cat matches “cat” or “cats” but not “the cat”
$ 代表一个字符串的结束,例如cat$ matches “the cat” but not “cat in the hat”
[xyz] 代表方括号内任一个字符,例如ca[rt] matches “cat“ or “car”
[a-zA-Z],[a-z] 同上
{n} 重复前面子字符串n次,例如\d{5}=\d\d\d\d\d
{n.}重复前面子字符串n次或更多次
{n,m}重复前面子字符串n次至m次
[^abcxyz]匹配除了abcxyz之外的其他任何字符,例如[^8]\d\d matches 123 but not 812
x|y匹配x或y,例如c(a|o)t matches “cat” and “cot”
\s 代表任何空格
\S 代表除了空格之外的任何字符
\w 代表任何字符,不管大小写,空格,下划线
\( 代表(
\) 代表)
/……/i 不区分大小写

%macro date_covert(var);
 &var.=tranwrd(&var.,'/','-');
 * Compile the Perl Regular Expression;
 retain pattern;
 if _N_=1 then
pattern=prxparse("/(\d{4}|-|UN)?-?(\d{2}|\d{1}|-|UN)?-?(\d{2}|\d{1}|-|UN)?T?(\d{2}|-)?:?(\d{2}|-)?:?(\d{2}|-)?/");

 * get each part of the datetime variable;
 match=prxmatch(pattern,&var.);
 yy=prxposn(pattern,1,&var.);
 mm=prxposn(pattern,2,&var.);
 dd=prxposn(pattern,3,&var.);

 drop pattern match yy mm dd ;
%mend;
prxparse执行且不为0,然后prxmatch执行后且不为0,然后prxposn最后执行,1,2,3表示模版中用括号括起来的第一,二,三部分。

%macro dtderive(datein=,dateout=);
 &datein.=strip(compbl(&datein.));
 retain ret;
 if _n_=1 then ret=prxparse("/(\d\d?|\w\w)?\s+(\D\D\D)?\s?(\d{4}|\w{4})?/i");
 match=prxmatch(ret,&datein.);
 yy=prxposn(ret,3,&datein.);
 mm=prxposn(ret,2,&datein.);
 dd=prxposn(ret,1,&datein.);
 yy1=tranwrd(yy,"0000","");
 mm1=put(upcase(strip(mm)),$mon.);
 dd1=tranwrd(tranwrd(lowcase(dd),"un",""),"uk","");
*如果使用prxchange,紧跟着带入dd1计算的时候,还没有work; prxchange('s/u|n|k/i /',-1,dd)
*日期缺失format成iso8601形式;
 if dd1="" and mm1="" then &dateout.=yy1;
 else if dd1="" then &dateout.=cats(coalescec(yy1,"-"),"-",coalescec(mm1,"-"));
 else if dd1 ne "" then &dateout.=cats(coalescec(yy1,"-"),"-",coalescec(mm1,"-"),"-",put(input(dd1,??best.),z2.));
%mend;

猜你喜欢

转载自www.cnblogs.com/jwcutey/p/12159361.html