Regex 分析SAS 9.2中包含'|';性格

Regex 分析SAS 9.2中包含'|';性格,regex,sas,Regex,Sas,我有一个变量,它包含由|符号分隔的多个公司。我想数一数那里有多少家公司。i、 例如,|+1的数字,理想情况下标识|符号在字符串中的位置。注:单个变量中的公司数不得超过五家。我试图使用以下方法,但遇到这样一个事实:SAS将|符号视为特殊运算符 pattern1 = prxparse('/|/'); /* I can't seem to get SAS to treat this as a text to compare */ start = 1; stop = length(reassignmen

我有一个变量,它包含由|符号分隔的多个公司。我想数一数那里有多少家公司。i、 例如,|+1的数字,理想情况下标识|符号在字符串中的位置。注:单个变量中的公司数不得超过五家。我试图使用以下方法,但遇到这样一个事实:SAS将|符号视为特殊运算符

pattern1 = prxparse('/|/'); /* I can't seem to get SAS to treat this as a text to compare */
start = 1;
stop = length(reassignment2); /* my list of firms is in the variable reassignment2 */
call prxnext(pattern1, start, stop, reassignment2, position, length);
ARRAY Y[5];
do J=1 to 5 while (position > 0);

  Y[J]=position;
  call prxnext(pattern1, start, stop, reassignment2, position, length);
end;
nfirms=j+1;
run;

我会做一些不同的事情。你真正想要的不是|个字符的数量,而是实际的公司,对吗?所以,寻找那些。您的代码有一些小问题;首先,在使用
调用prxnext
之前,必须先
prxmatch
,因为循环迭代器的增量实际上超过了最后一个限定循环值(我使用j-1,因为我会找到比您多的一个元素),所以j+1是错误的,而
|
是一个正则表达式元字符,如果您确实想使用它,则必须将其转义,除非它位于
[]
内部,就像我正在使用它一样

data test;
infile datalines truncover;
input @1 reassignment2 $50.;
pattern1 = prxparse('/[^|]+/io'); /* Look for non-| characters */
start = 1;
stop = length(reassignment2); /* my list of firms is in the variable reassignment2 */
rc=prxmatch(pattern1,reassignment2);
if rc>0 then do;
    ARRAY Y[5];
    do J=1 by 1 until (position = 0);
      call prxnext(pattern1, start, stop, reassignment2, position, length);
      Y[J]=position;
    end;
    nfirms=j-1;
end;
else nfirms=0;
put nfirms=;
datalines;
Firm1|Firm2|Firm3
Firm1|Firm2|Firm3|Firm4
Firm1
Firm1|Firm2
;;;;
run;
为了完整性起见,您也可以使用
callscan
在不使用正则表达式的情况下轻松完成此操作

data test;
infile datalines truncover;
input @1 reassignment2 $50.;
array y[5];
do nfirms=1 by 1 until (position le 0);
    call scan(reassignment2,nfirms,position,length,'|');
    y[nfirms]=position;
end;
nfirms=nfirms-1; *loop ends one iteration too late;
put nfirms=;
datalines;
Firm1|Firm2|Firm3
Firm1|Firm2|Firm3|Firm4
Firm1
Firm1|Firm2
;;;;
run;

我同意@Joe的观点,没有正则表达式可以更简单地实现这一点,不过我会进一步简化他的代码,以排除数组的使用

data test;
    infile datalines truncover length = reclen;
    input firmlist $varying256. reclen;
    i = 0;
    do until(scan(firmlist,i,"|") = "");
        i + 1;
    end;
    nfirms = i - 1;
    drop i;
    datalines;
Firm1|Firm2|Firm3
Firm1|Firm2|Firm3|Firm4
Firm1
Firm1|Firm2
;
run;
您说过您还希望捕获字符串中“|”字符的位置,但是如果每条记录有多个公司,那么字符串中将有多个“|”字符。如果您想知道每一个的位置,数组可能是一个更好的路由,但是如果您只需要一个,那么
index
函数将为您提供所需的内容。您将使用
delimpos=index(firmlist,“|”)


我希望这有帮助

数组用于存储每条记录的位置;OP表示这是一个期望的输出。OP:如果我是你,我会同意@Joe的答案。:)