我试图在SAS SQL语句中使用正则表达式,但无法让它们工作。它运行,但不返回匹配的表达式(列xx始终为空)。不确定这是我做错了,还是SAS不让你这样做。
proc sql noprint;
create table xx as
select *,
prxposn(prxparse("/a/i"), 0, name) as xx
from sashelp.class
;
quit;
谢谢Rob
编辑:我知道我可以只是做PROC SQL,然后在一个数据步骤做正则表达式-我可以得到的工作很好,我只是想知道是否有可能做到这一切在PROC SQL。
我不认为文档对此事特别清楚,但是"PRXPOSN函数使用PRXMATCH, PRXSUBSTR, PRXCHANGE或PRXNEXT的结果来返回捕获缓冲区",因此您必须首先调用这些函数之一,使用您通过PRXPARSE生成的正则表达式ID,在调用PRXPOSN之前。
下面的SAS代码在9.1.3上为我工作。我不完全清楚您的意图,但我假设您想捕获从第一个"a"开始的后缀,因此我相应地修改了您的正则表达式:
proc sql;
create table xx as
select *,
prxparse("/aw*/i") as re,
ifc(
prxmatch(calculated re, name),
prxposn(calculated re, 0, name),
" "
) as xx
from sashelp.class;
quit;
这种方法的一个缺点(除了它明显缺乏优雅)是它向输出数据集添加了一个额外的变量(re)。以下资料对我追查PRXPOSN的行为很有帮助:
- http://support.sas.com/rnd/base/datastep/perl_regexp/regexp-tip-sheet.pdf
- http://communities.sas.com/thread/30443
- http://groups.google.com/group/comp.soft-sys.sas/browse_thread/thread/15ec39268d497990/d2eaf9c4512ee0b5?lnk=gst& q = prxposn& pli = 1
这可能与您想要的不同,但这将使用name
:
xx
:
proc sql noprint;
create table xx as
select *,
prxmatch('/a/i', name) as xx
from sashelp.class
;
quit;