我有几个这样的宏变量:
%let name=MyCamelisedString;
我正在寻找一个公式,以便在每个大写字母前自动添加空格(第一个字母除外,但我可以自己改正)。
为了获得:
我的骆驼弦
我目前的想法是使用ANYUPPER()函数,但这需要一个循环,这很容易避免。
答案 0 :(得分:2)
您可以使用一个简单的正则表达式来执行此操作,尽管宏语法有点麻烦:
%let name=MyCamelisedString;
%let regex = %sysfunc(prxparse(s/([A-Z])/ $1/));
%let name2 = %sysfunc(prxchange(®ex, -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(®ex2, -1, &name));
这有两个匹配条件:
(?<![A-Z])[A-Z]
与前面没有其他大写字母的任何大写字母匹配。这是negative lookbehind。[A-Z][a-z]
匹配后跟小写字母的所有大写字母。如果您按照stallingOne的建议仅使用([A-Z][a-z])
,则该名称将与全大写单词的开头不匹配,并且上面示例字符串的输出为My Camelised StringCAPSWORD Properword
。