Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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
Regex 在字符串中查找点分隔的单词_Regex_Logging_Sas_String Parsing - Fatal编程技术网

Regex 在字符串中查找点分隔的单词

Regex 在字符串中查找点分隔的单词,regex,logging,sas,string-parsing,Regex,Logging,Sas,String Parsing,我需要分析一个日志文件,以找出与以下不区分大小写模式匹配的字符串: libname.data <--- Okay libname.* <--- Not okay 我试过的 此PERL正则表达式: /^(?。*[.]{2})[a-z0-9*.-]+(?:\.[a-z0-9;\:-]+)+$/mi data test; line = 'NOTE: COMPRESSING DATA SET LIBNAME.DATA DECREASED SIZE BY 46.44 P

我需要分析一个日志文件,以找出与以下不区分大小写模式匹配的字符串:

libname.data   <--- Okay
libname.*      <--- Not okay
我试过的 此PERL正则表达式:

/^(?。*[.]{2})[a-z0-9*.-]+(?:\.[a-z0-9;\:-]+)+$/mi

data test;
    line = 'NOTE: COMPRESSING DATA SET LIBNAME.DATA DECREASED SIZE BY 46.44 PERCENT';

    prxID = prxparse('/(?!.*[.*]{3})[a-z]+[a-z0-9_]+(?:\.[a-z0-9_]+)/mi');
    call prxsubstr(prxID, line, position, length);

    dataset = substr(line, position, length);
run;

在SAS代码中:

data test;
    line = 'words and stuff libname.data';
    test = prxmatch('/^(?!.*[.*]{2})[a-z0-9*_:-]+(?:\.[a-z0-9;_:-]+)+$/mi', line);
run;
问题 当该行仅包含此确切字符串时,此选项将起作用,但如果该行包含其他字符串,则此选项将不起作用

解决方案 谢谢你,瞎子

我从日志解析SAS数据集的正则表达式是:

/(?!.[.]{3})[a-z+[a-z0-9+(?:\.[a-z0-9+)/mi

data test;
    line = 'NOTE: COMPRESSING DATA SET LIBNAME.DATA DECREASED SIZE BY 46.44 PERCENT';

    prxID = prxparse('/(?!.*[.*]{3})[a-z]+[a-z0-9_]+(?:\.[a-z0-9_]+)/mi');
    call prxsubstr(prxID, line, position, length);

    dataset = substr(line, position, length);
run;

这仍然会拾取一些SQL select语句,但这很容易通过后处理解决。

如果在开始时锚定了表达式,只需删除第一个
^
,即可设置

/(?!.*[.*]{2})[a-z0-9*_:-]+(?:\.[a-z0-9;_:-]+)+$/mi

开始时的前瞻性禁止匹配
,但模式本身不会匹配,因为字符类重复1次或多次,并且不包含点

如果您不想同时匹配
**
,并且字符串不应以
*
开头,则可以将其与点一起添加到字符类
[*.]
,并将其从第一个字符类中删除

在这种情况下,可以省略正向前瞻和锚定:

/[a-z0-9_:-]+(?:[.*][a-z0-9_:-]+)+/i


由于模式不包含任何锚定,您可以省略
m
标志。

只需在日志文件行中定位以下地标文本即可

... data set <LIBNAME>.<MEMNAME> ...
。。。数据集。。。
如果数据集名称在日志中,则可以假定其格式正确

data want;
  length line $1000;
  infile LOG_FILE lrecl=1000 length=L;
  
  input line $VARYING. L;

  * literally "data set <name>" followed by space or period;
  rx = prxparse('/data set (.*?)\.(.*?)[. ]/');

  if prxmatch(rx,line) then do;
    length libname $8 memname $32;
    libname = prxposn(rx,1,line);
    memname = prxposn(rx,2,line);
    line_number = _n_;
    output;
  end;

  keep libname memname line_number;
run;
需要数据;
长度线1000美元;
填充日志文件lrecl=1000长度=L;
输入行$可变。L
*字面上的“数据集”,后跟空格或句点;
rx=prxparse('/数据集(.*?\.(.*?[.]/');
如果PRX匹配(接收,线路),则执行;
长度libname$8 memname$32;
libname=prxposn(rx,1,行);
memname=prxposn(rx,2,行);
行号=\u n\u;
产出;
结束;
保留libname memname line_编号;
跑
如果数据集名称是
''N


web上还有大量现有的SAS日志文件解析器和分析器可供您使用。

删除
^
锚定如果您正在扫描日志,只需检查注释:行即可。数据集名称仅在此处为大写。