regex 函数是否在PRX函数处理之前转义值?

to94eoyn  于 2023-06-30  发布在  其他
关注(0)|答案(3)|浏览(102)

我使用了(很多)prx函数(Perl正则表达式函数),但是在某些情况下,我在宏函数中使用它们,并将一些东西作为参数传递给搜索,例如。

%macro test(exp=);
  proc sql noprint;
    select      file
    into        :_input_file trimmed
    from        folder_content
    where       prxmatch("/&exp.$/oi", strip(file))
    ;
  quit;
%mend test

在大多数情况下,这是可行的,除非exp的值包含PRX元字符(例如/或括号)
最好的做法是对这些字符进行转义,但这对用户不友好。假设我想搜索一个文件/home/user/file.txt,斜线会导致宏失败,而我应该传递值\/home\/user\/file.txt
在实现我自己的转义函数之前,我想确保它不存在,但是到目前为止我还没有找到它
我期望一个原生SAS函数将任何文本值转换为PRX函数中的“即用”值

9njqaruj

9njqaruj1#

使用除/之外的东西

13   data _null_;
14      x = 'MCLAUREN';
15      x = prxchange("s!(MC)!\u\L$1!i", -1, x);
16      put x=;
17      x = prxchange("s/(MC)/\u\L$1/i", -1, x);
18      put x=;
19   run;

x=McLAUREN
x=McLAUREN
arknldoa

arknldoa2#

没有像你要求的功能(我甚至不确定我能理解这样的功能将被期望做什么)。
但对于你的例子,只是想把值当作一个字符串(即不是一个实际的正则表达式),那么就没有太多需要发生的事情。

  • 将任何现有的\转换为\,以防止它们被用于转义下一个字符。
  • 添加\到任何出现的分隔符(在您的示例中是/),以转义它。

如果你有一个名为EXP的宏变量

%let exp=c:\mixed_up/path ;

您可以将其转换为可在WHERE子句中使用的内容

%let want=%qsysfunc(tranwrd(%superq(exp),\,\\));
%let want=%qsysfunc(tranwrd(&want,/,\/));

这将创建:

650  %put &=want;
WANT=c:\\mixed_up\/path
px9o7tmv

px9o7tmv3#

/是用于匹配的隐式m/m后面的第一个字符是表达式 bounder。因此,请使用初始字符,例如#"#&exp.$#oi"-解析的&exp中的任何/都将被视为文字/
将正则表达式模式与宏混合使用可能会非常令人沮丧,并且似乎是一个无休止的逃避现实的陷阱。考虑将您的模式视为数据,并将它们连接到所关注的数据集。奖金不是宏。

data mypatterns;
  rx = '....'; output;
  rx = '....'; output;
  ...
run;  

proc sql noprint;
  create table matches as 
  select      file
  from        folder_content
  join        mypatterns p
    on        prxmatch (strip(p.rx),strip(file))
  ;
quit;

相关问题