使用正则表达式删除宏变量括号内的文本

时间:2019-07-01 16:44:30

标签: sas

我无法使用%sysfunc(prxchange(...))删除括号和括号内的文本。参见示例

%macro test(col=);
    %local result;
    %let result = %sysfunc(prxchange(s|\([^\)]+\)||i, -1, &col.));
    %put &result.;
%mend test;

%let string = try (to) remove (this);
%test(col=%str(&string.))

ERROR: Expected close parenthesis after macro function invocation not found.

预期输出应为try remove(忽略双精度空格)

编辑-感谢@ user667489,最简单的解决方法

%macro test(col=);
    %local result;
    %let result = %sysfunc(compbl(%sysfunc(prxchange(s|%quote(\%([^\%)]+\%)||i), -1, &col.))));
    %put &result.;
%mend test;

%let string = try (to) remove (this);
%test(col=%str(&string.));

3 个答案:

答案 0 :(得分:2)

由于%sysfunc()必须将宏代码转换为值以推送您要调用的函数的性质,因此不确定是否可以解决此问题。

为什么不只将PRXCHANGE()函数调用留在实际的SAS代码中?

例如,您可以让您的宏生成DATA步骤。我建议只传入具有值文本的宏变量的名称和要将结果分配到的宏变量的名称。

%macro test(invar,outvar);
%if not %symexist(&outvar) %then %global &outvar;
data _null_;
  call symputx("&outvar",prxchange('s|\([^\)]+\)||i', -1,symget("&invar")));
run;
%mend test;

%let string = try (to) remove (this);
%test(invar=string,outvar=result);
%Put &=result;

答案 1 :(得分:2)

我找到了使它或多或少按原样工作的方法:

%macro test(col=);
    %local result regex;
    %let regex = %sysfunc(prxparse(%str(s/\%([^\%)]+\%)//)));
    %let result = %sysfunc(prxchange(&regex, -1, &col.));
    %syscall prxfree(regex);  /*Prevent memory leak*/
    %put &result.;
%mend test;

%let string = try (to) remove (this);
%test(col=%str(&string.));

在正则表达式中使用%符号括弧以防止将其解析为SAS代码,而使用单独的prxparse似乎可以解决问题。

答案 2 :(得分:0)

也可以尝试以下方法:

%macro string(string);
   %local new_string;
   %let new_string=%sysfunc(prxchange(s/\s?\(\w+\)//,-1,&string));
   %put &new_string;
%mend;

%string(%str(try (to) remove (this)));