用SAS中的前导0替换字符串中的任何单个数字

时间:2017-01-31 14:01:31

标签: regex sas

我有一个变量,其值为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(正则表达式)以较少的复杂性在几个步骤中完成。

我尝试了很多不同的排列和组合而没有运气。

感谢您提前的帮助!

1 个答案:

答案 0 :(得分:2)

我不知道SAS正则表达式是否支持lookarround,但是,如果确实如此,这应该可以完成这项工作:

  • 搜索:(?<=-)(\d)(?!\d)
  • 替换:0$1

其中:

  • (?<=-)是一个外观,确保我们之前有一个破折号
  • (\d)是在第1组中捕获的单个数字
  • (?!\d)是一个负面的预测,确保我们在
  • 之后没有数字