作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 SAS 中正则表达式的使用有疑问。
我的数据集是这样的:
我希望它看起来像这样:
一开始我认为先分配新的列然后按行分配会更容易。
我的尝试如下所示:
proc ds2;
data Codes (overwrite=yes);
dcl char(16) code1 code2 code3 code4 code5 code6;
dcl double re;
keep code1 code2 code3 code4 code5 code6;
retain re;
method init();
dcl varchar(32) expression;
expression = '/(\w+\d+)+/';
re=prxparse(expression);
if missing( re ) then do;
put 'ERROR: Invalid expression ' expression;
stop;
end;
end;
method run();
set mytable;
code1 = 'ERROR';
if prxmatch(re, Code) then
do;
code1=prxposn(re, 0, Code);
code2=prxposn(re, 1, Code);
code3=prxposn(re, 2, Code);
code4=prxposn(re, 3, Code);
code5=prxposn(re, 4, Code);
code6=prxposn(re, 5, Code);
end;
else do;
code1='0';
end;
end;
enddata;
run;
quit;
proc print data=Codes;
run;
quit;
然而,什么都没有改变。结果,我得到了 code1 和 code2 列,就像初始数据集中的 Code 列一样被填充。我真的很感激任何帮助,因为正则表达式不是我的强项。我还将 code1 = 'ERROR' 和后来的 code1 = '0' 放在一起,以检查代码是否有效。
需要注意的是,我创建了 code6 作为试用。我不知道每个 ID 的确切代码数。但是,我确实知道代码必须始终是一个字母与一位或两位数字的组合,它也可以采用 Z12-9 的形式(因此一个字母后跟两位数字,然后是破折号,然后是一位数字).
提前致谢!
最佳答案
回答这个正则表达式部分,你的正则表达式是错误的,我认为 prxposn
可能也是错误的。
\w
匹配数字和 alpha,因此 \w+
将获取所有字符串。您需要使用 [A-Z]
或使用 \w+?
来使用较不积极的匹配来仅获取单个 alpha-then-numeric 集。
此外,这里正确的方法是调用prxnext
,prxposn
匹配正则表达式中中的每个括号匹配,所以1是第一个, 2 是第二个,但 (something)+
只有一个括号匹配。 call prxnext
将继续查找单个匹配项的更多匹配项,您可以使用它来获取匹配位。
这里也是简单的数据步骤,但 DS2 会类似。
data want;
set have;
rx = prxparse('/[A-Z]+\d+/ios');
start = 1;
do until (pos eq 0);
call prxnext(rx,start,length(code),code,pos,len);
if pos gt 0 then do;
w = substr(code,pos,len);
put w=;
output;
end;
end;
run;
关于regex - 使用正则表达式将字符串拆分为多个变量 SAS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70394683/
我是一名优秀的程序员,十分优秀!