2

我正在寻找一个 SAS 正则表达式来匹配字符串开头的 1-3 位数字,并且这样的数字序列后面应该跟空格 - 如下所示(string1string2string3

data _null_;
string1='1   y';
string2='22  x';
string3='333 z';
string4='z1   y';
string5='2z  x';
rx=prxparse('/^\d????/');
if prxmatch(rx,string1) then put 'match';
if prxmatch(rx,string2) then put 'match';
if prxmatch(rx,string3) then put 'match';
if prxmatch(rx,string4) then put 'notmatch';
if prxmatch(rx,string5) then put 'notmatch';
run;
4

2 回答 2

3

只是为了好玩,一些微不足道的非正则表达式解决方案(每个都有弱点/优势取决于您的数据/期望的结果)......我不在这里检查大部分这些的长度,所以如果你需要消除你有的情况4 位或更多位(即,如果 string1="1234 main" 将失败)通过 length() 添加。

if notdigit(scan(string1,1)) then put 'no match';
if compress(scan(string,1),,'d') ne ' ' then put 'no match';

NOTDIGIT 对于这样的事情来说是一个很棒的功能——如果你不需要检查 4 个以上的字符,这可能是一个比正则表达式更快的解决方案。

另外,建议 - 对于 SAS,如果您使用的是 9.2 或更高版本,您应该这样编写正则表达式:

rx=prxparse('/^\d{1,3}(?=\s)/o');

o 指示编译器只编译一次正则表达式。(这取代了旧的 'retain and if _n_=1' 方法。)如果您想匹配 3 位数字而不是其他任何东西(即,如果“333”是匹配项,则相反,您可能还想使用 \b 而不是 \s到“333”,并且可以有一个 3 宽度的变量) - \s 是一个空白字符,而 \b 是一个单词边界,它类似于 \s 但也包括字符串的结尾标记。

于 2012-11-21T02:03:55.370 回答
1

有点不清楚你在找什么,但我相信你需要这个正则表达式模式

^\d{1,3}(?=\s)
于 2012-11-20T23:18:33.037 回答