String 在SAS中,如何在宏字符串中的每个大写字母前面添加空格?
我有几个宏变量,如下所示:String 在SAS中,如何在宏字符串中的每个大写字母前面添加空格?,string,sas,String,Sas,我有几个宏变量,如下所示: %let name=MyCamelisedString; 我正在寻找一个公式,在每个大写字母前自动添加空格(除了第一个,但我可以自己更正) 为了获得: 我的骆驼线 我目前的想法是使用函数,但这需要避免一个循环。您可以使用一个简单的正则表达式来实现这一点,尽管宏语法有点麻烦: %let name=MyCamelisedString; %let regex = %sysfunc(prxparse(s/([A-Z])/ $1/)); %let name2 = %sys
%let name=MyCamelisedString;
我正在寻找一个公式,在每个大写字母前自动添加空格(除了第一个,但我可以自己更正)
为了获得:
我的骆驼线
我目前的想法是使用函数,但这需要避免一个循环。您可以使用一个简单的正则表达式来实现这一点,尽管宏语法有点麻烦:
%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));
%let name=mycamelisedstringcapswordperword;
%让regex2=%sysfunc(prxparse(s/(?)?
这有两个匹配条件:
(?匹配前面没有其他大写字母的任何大写字母。这是一个
[A-Z][A-Z]
匹配任何后跟小写字母的大写字母
如果您只是按照stallingOne的建议使用([A-Z][A-Z])
,这将与全大写单词的开头不匹配,并且上面示例字符串的输出是My Camelized StringCAPSWORD Properword
,您可以使用一个简单的正则表达式来执行此操作,尽管宏语法有点麻烦:
%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));
%let name=mycamelisedstringcapswordperword;
%让regex2=%sysfunc(prxparse(s/(?)?
这有两个匹配条件:
(?匹配前面没有其他大写字母的任何大写字母。这是一个
[A-Z][A-Z]
匹配任何后跟小写字母的大写字母
如果您只使用([A-Z][A-Z])
正如stallingOne所建议的,这与一个全大写单词的开头不匹配,上面示例字符串的输出是My Camelized StringCAPSWORD Properword
很好!如果大写字母后跟另一个大写字母,有没有办法不拆分?如HACCP Processing
应该变成HACCP Processing大小
我想我找到了:%sysfunc(prxparse(s/([A-Z][A-Z])/$1/);很好!如果大写字母后面跟另一个大写字母,有没有办法不拆分?比如haccprocessingsize
应该变成HACCP处理大小
我想我找到了:%sysfunc(prxparse(s/([A-Z][A-Z])/$1/);