Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在SAS中,如何在宏字符串中的每个大写字母前面添加空格?_String_Sas - Fatal编程技术网

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(&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));
%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(&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));
    
    %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/);