Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 使用perl正则表达式匹配SAS中跨多行的模式_Html_Regex_Sas - Fatal编程技术网

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

Html 使用perl正则表达式匹配SAS中跨多行的模式,html,regex,sas,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> 感兴趣的领域 利息

我在HTML.HTML中存储了这样一个HTML片段:

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

感兴趣的领域
  • 利息
  • 利息
其他
我已经构建了一个正则表达式模式
(/(\w*\w*)*/)
,该模式匹配第一个
标记和第二个
标记之间的所有内容,但是如何让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;
html文件名;
数据兴趣(下降=模式);
长度为2500美元;
如果N=1,则
PATTERN=PRXPARSE(“/(\w*\w*)*/”;
保留模式;
填充html LRECL=2500;
字符串:2500美元。;
如果PRXMATCH(模式、字符串)GT 0,则输出;
跑

目前我得到的结果是空白的。

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

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

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

数据兴趣(保持=多行);
长度多行250美元;
设置html;
字符串=修剪(字符串);
保留多行;
多行=猫(多行,字符串);
如果查找(字符串“”)>0,则多行=字符串;
如果查找(字符串“”)>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;
需要数据;
填充'path\yourhtml'truncover;
长度字符串$100;
输入@;
如果索引(_infle,'h4')>0,则执行该操作;

string=prxchange('s/*\>(.*)\让SAS跨多行搜索的方法是更改SAS定义“行”的方式


例如,您可以使用<代码> RefFM=n>代码>,它告诉SAS只考虑文件在所有行中没有概念的字节流,也可以使用<代码> ReFMF=代码>代码>,它设置固定的行大小。(可以任意大到机器的最大容量,但如果您想使用

\u infle\u
,32767是最大容量)。

试试
PATTERN=PRXPARSE(“/(?为什么要标记Perl?@DaveCross是因为Perl的一个特性是自然表达式。@Stribizev如果不清楚,很抱歉,问题是SAS代码,而不是Perl表达式。Perl表达式与行匹配,我已经在在线测试程序中测试过,例如@DaveCross Ok,你赢了。这不是Perl问题Hey Shenglin,谢谢suggestion。不幸的是,它成功地提取了h4标记之间的标题,但没有提取下面的点。原因是您的代码一次只检查一行。感谢您的建议。我很高兴您确认我不能使SAS同时接收多行。我自己也倾向于连接,今天我实现了一个ve你的代码的版本,所以非常感谢你!
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;