首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >正则表达式之正向预查(?=...)

正则表达式之正向预查(?=...)

作者头像
专业余码农
发布2020-07-15 16:57:22
发布2020-07-15 16:57:22
1.3K0
举报
文章被收录于专栏:老Z的博客老Z的博客

最近看到一个群友的问题:如何提取宏调用的参数和参数值?这个问题用常规的字符函数可能要多行才能解决,用正则表达式就相对简单了,程序如下:

代码语言:javascript
复制
data demo;
    STRING='%test(var1=123, var2=abc, var3=abc123);';
    REX=prxparse('/(\w+\s*=\s*.+?[,\)])/');
    START=1;
    STOP=length(STRING);
    call prxnext(REX, START, STOP, STRING, POSITION, LENGTH);
    do while(POSITION > 0);
        TEMP=substr(STRING, POSITION, LENGTH);
        PARAM=scan(TEMP, 1, '=');
        VALUE=substr(TEMP, length(PARAM)+2);
        VALUE=prxchange('s/[\),]$//', -1, cats(VALUE));
        output;
        call prxnext(REX, START, STOP, STRING, POSITION, LENGTH);
    end;
    keep PARAM VALUE;
run;

我们可以看到上面的宏调用的参数值都是简单的字符,如果参数值中包含逗号上面的程序就不能用了。 比如下面这样的:

代码语言:javascript
复制
STRING='%test(var1=123, var2=%nrstr(NOTE: Y=Yes, N=No, U=Unkonw), var3=%nrstr(NOTE: (Y=Yes (or true))));';

这个时候我们就要先转换一下参数中的逗号,而借助正则表达式中的正向预查(?=...)可以轻松完成,程序如下:

代码语言:javascript
复制
STRING=prxchange('s/,(?=[^\(]*\)[,\)])/~/', -1, STRING);

(?=...)表示正向匹配,且不保存所匹配的内容。我们可以将它理解为自定义的边界(\b),这个边界位于表达式末。上面的表达式中[^\(]*表示匹配非括号字符零次或多次,\)[,\)]表示匹配),或者)),整个表达式的意思是只替换后面是),或者))的逗号,比如第一个逗号,因为后面有%nrstr(,包含有(,所以匹配不成功,逗号不会被替换。第二个逗号,因为后面有),,所以匹配成功。 完整的程序如下:

代码语言:javascript
复制
data demo;
    STRING='%test(var1=123, var2=%nrstr(NOTE: Y=Yes, N=No, U=Unkonw), var3=%nrstr(NOTE: (Y=Yes (or true))));';
    STRING=prxchange('s/,(?=[^\(]*\)[,\)])/~/', -1, STRING);
    REX=prxparse('/(\w+=.+?[,\)]+)/');
    START=1;
    STOP=length(STRING);
    call prxnext(REX, START, STOP, STRING, POSITION, LENGTH);
    do while(POSITION > 0);
        TEMP=substr(STRING, POSITION, LENGTH);
        PARAM=scan(TEMP, 1, '=');
        VALUE=substr(TEMP, length(PARAM)+2);
        VALUE=prxchange('s/[\),]$//', -1, cats(VALUE));
        VALUE=prxchange('s/~/, /', -1, VALUE);
        output;
        call prxnext(REX, START, STOP, STRING, POSITION, LENGTH);
    end;
    keep PARAM VALUE;
run;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档