SAS PRXCHANGE将单词之间的数字转换为相似数量的空格

时间:2017-02-14 11:41:26

标签: regex sas

是否可以使用此字符串中的数字:

'xx8xx'

将数字替换为8个空格以获取此字符串:

'xx        xx'

我可以识别xx之间的数字,但替换语法不能按预期工作:

PRXCHANGE(s/xx([\d]*)xx/' ' x $1/io, -1, 'xx8xx')

有没有办法用$ 1中的数字来重复该数字的空格字符,比如'x $ 1?

任何帮助非常感谢! Tiaan

2 个答案:

答案 0 :(得分:0)

假设您需要更换三个空白。

data _null_;
  x=prxchange('s/(xx)\d+(xx)/$1   $2/', -1, 'xx8xx');
  _x=prxchange('s/(?=\w+)(\d+)/   /',1,'xx8xx');
  put _all_;
run;

修改 我错过了重要的信息。可以使用Tranwrd和repeat来获得它。

data _null_;
   x=tranwrd('xx8xx', prxchange('s/.*(\d+).*/$1/',1,'xx8xx'), repeat(' ',prxchange('s/.*(\d+).*/$1/',1,'xx8xx')));
   put _all_;
run;

答案 1 :(得分:0)

您需要先提取,然后编译一个新的正则表达式。这将是昂贵的,因为你必须每行编译一次。

data have;
input xstr $;
datalines;
xx8xx
xx3xx
xx4xx
;;;;
run;

data want;
  set have;
  rx1 = prxparse('/xx([\d])*xx/io');
  rc1 = prxmatch(Rx1,xstr);
  num_x = prxposn(rx1,1,xstr);

  rx2 = prxparse(cat('s/(xx)[\d]*(xx)/$1',repeat(" ",num_x-1),'$2/i'));
  newstr = prxchange(rx2,-1,xstr);
run;