SAS 使用 PRX 查找字符串模式

问题描述 投票:0回答:1

我有一个 SAS 数据集,其中包含多个观察结果,单个变量中包含来自 PDF 的文本。

我需要使用以下模式解析字符串以进行进一步处理。

txt="ABCCXX.DEFG hijkj LMNO = YYYYYYYY" 
  • XX 可以是 A-Z 中的任何字符(大写)(总共 2 个字符,总是)
  • YYYYYYYY 可以是 A-Z(大写)中的任何字符或 0 到 9 之间的任何数字(最多 8 个字符,包括数字(如果存在);但可以小于 8)
  • 提到的其他字符总是相同的(即第一个字符总是 A,第二个字符总是 B,依此类推)。
  • 字符串结束后总是有一个空格(可能有助于搜索)
  • 这个字符串可以多次出现。我需要在一个单独的变量中每次出现

由于我对 PRX 函数的了解有限,我只能得出以下结论。显然,它不处理我上面提到的 'b' 和 'e'。

data want;
   set have;
   length var8 $200;
   search8 = prxparse("/[A][B][C][C][A-Z][A-Z][.][D][E][F][G][\s][h][i][j][k][j][\s][L][M][N][O][\s][=][\s][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]/oi");
   if prxmatch(search8,txt) then do;
     call prxsubstr(search8,txt,start,length);
     if start>0 then var8=substr(txt,start,length);
   end;
run;
regex sas
1个回答
1
投票

当只有一个字符时,你不需要

[]
字符类。

您将需要一个带有

()
捕获组用于提取和
{a,b}
用于出现范围的模式。可以通过
PRXNEXT
在循环中多次应用该模式。

例子:

data work.have;
  length line $256;
  input;
  line = _infile_;
datalines4;
txt="ABCCPQ.DEFG hijkj LMNO = 123456AB"
txt="ABCCVW.DEFG hijkj LMNO = ZZZZZZZZ"; txt="ABCCXY.DEFG hijkj LMNO = 12"
;;;;

data want;
  rx = prxparse('m/"ABCC([A-Z]{2})\.DEFG hijkj LMNO = ([A-Z0-9]{1,8})"/');

  set work.have;

  length found $256;

  start = 1;
  stop = length(line);
  do index = 1 by 1;
    call prxnext(rx, start, stop, line, pos, length);
    if pos = 0 then leave;
    found = substr(line, pos, length);
    xx = prxposn(rx,1,line);
    yy = prxposn(rx,2,line);
    put pos= found= xx= yy=;
  end;
run;

会记录

pos=5 found="ABCCPQ.DEFG hijkj LMNO = 123456AB" xx=PQ yy=123456AB
pos=5 found="ABCCVW.DEFG hijkj LMNO = ZZZZZZZZ" xx=VW yy=ZZZZZZZZ
pos=46 found="ABCCXY.DEFG hijkj LMNO = 12" xx=XY yy=12
© www.soinside.com 2019 - 2024. All rights reserved.