在SAS中,如何在宏字符串的每个大写字母前添加空格?

时间:2019-05-08 07:52:03

标签: string sas

我有几个这样的宏变量:

%let name=MyCamelisedString;

我正在寻找一个公式,以便在每个大写字母前自动添加空格(第一个字母除外,但我可以自己改正)。

为了获得:

  

我的骆驼弦

我目前的想法是使用ANYUPPER()函数,但这需要一个循环,这很容易避免。

1 个答案:

答案 0 :(得分:2)

您可以使用一个简单的正则表达式来执行此操作,尽管宏语法有点麻烦:

%let name=MyCamelisedString;

%let regex = %sysfunc(prxparse(s/([A-Z])/ $1/));

%let name2 = %sysfunc(prxchange(&regex, -1, &name));

%put &name2;

如果要避免在连续的大写字母前留空格(最后一个大写字母除外),则需要更复杂的正则表达式:

%let name=MyCamelisedStringCAPSWORDProperword;

%let regex2 = %sysfunc(prxparse(s/((?<![A-Z])[A-Z]|[A-Z][a-z])/ $1/));
%let name2 = %sysfunc(prxchange(&regex2, -1, &name));

这有两个匹配条件:

  1. (?<![A-Z])[A-Z]与前面没有其他大写字母的任何大写字母匹配。这是negative lookbehind
  2. [A-Z][a-z]匹配后跟小写字母的所有大写字母。

如果您按照stallingOne的建议仅使用([A-Z][a-z]),则该名称将与全大写单词的开头不匹配,并且上面示例字符串的输出为My Camelised StringCAPSWORD Properword