使用perl正则表达式匹配跨越SAS中多行的模式

时间:2015-07-14 10:41:16

标签: html regex sas

我有一个HTML代码段,存储在html.html中:

</head>
<body>
  <h4>Areas of interest</h4>
  <ul>
    <li>Interest</li>   
    <li>Interest</li>  
  </ul>
  <h4>Other</h4>
</body>

我构建了一个与模式匹配的REGEX模式(/<\/h4>(\w*\W*)*<h4>/),以提取第一个</h4>标记和第二个<h4>标记之间的所有内容,但是如何让SAS搜索模式多条线?

SAS代码:

filename html; 

data interests (drop=pattern);
   length string $2500;
   IF _N_ = 1 THEN
      PATTERN = PRXPARSE("/<\/h4>(\w*\W*)*<h4>/");
   RETAIN PATTERN;
   infile html LRECL=2500;
   string $CHAR2500.;
   IF PRXMATCH(PATTERN,STRING) GT 0 THEN OUTPUT;
run;

目前我的结果空白。

3 个答案:

答案 0 :(得分:2)

我认为你不能这样在SAS中这样做。

SAS将您的html的每一行视为单独的观察;如果你想整体解析它们,你需要一些逻辑来将它们连接在一起。以下是一个适用于您的示例代码的示例,但可能会在大量特殊情况下失败。正如评论者指出的那样,如果可以,最好使用html解析器。

此示例在看到<h4>时启动(或重新启动)行连接,并在看到</h4>时输出连接的行。

data interests (keep=multiline);
    length multiline $250;
    set html;
    string = trim(string);
    retain multiline;
    multiline = cats(multiline,string);
    if find(string,'<h4>') > 0 then multiline = string;
    if find(string,'</h4>') > 0 then do;
        output;
        multiline = '';
    end;
run;

答案 1 :(得分:1)

跨多行进行SAS搜索的方法是改变SAS定义&#34; line&#34;的方式。

例如,您可以使用recfm=n,它告诉SAS只是将文件视为完全没有概念的字节流。您还可以使用recfm=f,它设置固定的行大小(可以任意大到机器的最大容量,但如果您想使用_infile_则32767是最大值)。

答案 2 :(得分:0)

试试这个:

data want;
   infile 'path\yourhtml' truncover;
   length string $100;
   input @;
   if index(_infile_,'h4')>0 then do;
      string=prxchange('s/.*\>(.*)\<.*/$1/i',-1,_infile_);
      output;
   end;
run;