在SAS Proc SQL语句中使用Perl正则表达式



我试图在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:

中第一个a的位置填充xx:
proc sql noprint;
  create table xx as
  select *,
         prxmatch('/a/i', name) as xx
  from sashelp.class
  ;
quit;