使用“prxchange”更改空格,但不是所有空格

时间:2012-08-24 12:58:59

标签: regex sas

我需要将文本中的空格更改为下划线,但只需要单词之间的空格,而不是数字之间的空格,因此,例如

"The quick brown fox 99 07 3475"

会变成

"The_quick_brown_fox 99 07 3475"

我尝试在数据步骤中使用它:

mytext = prxchange('s/\w\s\w/_/',-1,mytext);

但结果不是我想要的

"Th_uic_row_ox 99 07 3475"

关于我能做什么的任何想法?

提前致谢。

3 个答案:

答案 0 :(得分:7)

Data One ;
X = "The quick brown fox 99 07 3475" ;
Y = PrxChange( 's/(?<=[a-z])\s+(?=[a-z])/_/i' , -1 , X ) ;
Put X= Y= ;
Run ;

答案 1 :(得分:3)

你正在改变 “W W” 至 “_” 当你想改变 “W W” 至 “W_W”

所以 prxchange( 'S /(\ w)的\ S(\ w)的/ $ 1_ $ 2 /', - 1,mytext的);

完整示例:

 data test;
mytext='The quick brown fox 99 07 3475';
newtext = prxchange('s/([A-Za-z])\s([A-Za-z])/$1_$2/',-1,mytext);
put _all_;
run;

答案 2 :(得分:1)

您可以使用CALL PRXNEXT函数查找每个匹配的位置,然后使用SUBSTR函数用下划线替换空格。我已经将正则表达式更改为\ w匹配任何字母数字字符,因此它应该在数字之间包含空格。我不确定你是如何使用该表达式获得结果的。 无论如何,下面的代码应该给你你想要的东西。

data have;
mytext='The quick brown fox 99 07 3475';
_re=prxparse('/[a-z]\s[a-z]/i'); /* match a letter followed by a space followed by a letter, ignore case */
_start=1 /* starting position for search */;
call prxnext(_re,_start,-1,mytext,_position,_length); /* find position of 1st match */
    do while(_position>0); /* loop through all matches */
        substr(mytext,_position+1,1)='_'; /* replace ' ' with '_' for matches */
        _start=_start-2; /* prevents the next start position jumping 3 ahead (the length of the regex search string) */
        call prxnext(_re,_start,-1,mytext,_position,_length); /* find position of next match */ 
end;
drop _: ;
run;