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日志文件解析器和分析器可供您使用。删除
^
锚定如果您正在扫描日志,只需检查注释:行即可。数据集名称仅在此处为大写。