我有一个变量,其值为t14-1-1,t14-1-1A,t14-2-1-1,t14-2-4-15A等,如下面的卡片声明中所述。
我需要的是用字母0填充字符串中的任何一个数字,就像我们使用sas格式z2一样。
data test01;
input have $40.;
want02=prxchange('s/(^|-)\d($|-)*/\10\2/',-1,strip(have));
want03=prxchange('s/(^|-)\d($|-)*(.+)/\10\2/',-1,strip(have));
cards;
t14-1-1
t14-1-1A
t14-2-1-1
t14-2-1-1A
t14-2-4-15A
t14-2-4-15B
t14-2-4-16
t14-2-4-17
t14-2-4-17A
t14-2-4-17B
l16-2-9-1-1
l16-2-9-2-1
l16-2-9-2-2
;
run;
我需要的是以下内容:
t14-01-01
t14-01-01A
t14-02-01-01
t14-02-01-01A
t14-02-04-15A
t14-02-04-15B
t14-02-04-16
t14-02-04-17
t14-02-04-17A
t14-02-04-17B
l16-02-09-01-01
l16-02-09-02-01
l16-02-09-02-02
我知道我有一种方法可以使用数组和扫描,长度和转换函数。我只是想知道这是否可以通过prxchange(正则表达式)以较少的复杂性在几个步骤中完成。
我尝试了很多不同的排列和组合而没有运气。
感谢您提前的帮助!
答案 0 :(得分:2)
我不知道SAS正则表达式是否支持lookarround,但是,如果确实如此,这应该可以完成这项工作:
(?<=-)(\d)(?!\d)
0$1
其中:
(?<=-)
是一个外观,确保我们之前有一个破折号(\d)
是在第1组中捕获的单个数字(?!\d)
是一个负面的预测,确保我们在