我试图找到一种方法来解析相当长的文本字符串。我想在字符串中的某些单词之间提取一个子字符串。下面是我正在查看的文本类型的示例:
endElement
我想解析字符串并创建如下所示的列:
String1 = "Report failed: FailType: FailLevel, FailDate 12.01.2016. InstanceType (name_of_type) -9234as-df32f-2f2f Error : Error_message1. Error : Error_message2. Error : Error_message3."
String2 = "Report failed: FailType: FailLevel, FailDate 12.01.2016. InstanceType (name_of_type) -zx3s-d2f-211 Error : Error_message1. Error : Error_message2."
每个字符串的错误数量不同。
我已根据以下最初的两条评论更新了我当前的问题进展:
Obs# | ErrorType1 | ErrorType2 | ErrorType3
1 | Error_message1 | Error_message2 | Error_message3
2 | Error_message1 | Error_message2 |
If _N_ = 1 Then Pattern = Prxparse("/ Error /");
Retain Pattern;
这确实给了我第一次出现“错误”这个词后的整个子字符串 - 空格是故意的。但是,我无法创建循环或搜索字符串“ Error ”的所有出现。我有这样的想法。
Position = prxmatch(Pattern, Strings);
Substring = substr(Strings, Position);
但根据我的结果(String1 和 String2 为空),很明显我对 prxposn 函数缺乏了解。我刚刚找到了 PRXNEXT 函数,想试一试。还不确定如何一次只获取一条错误消息。
最好的问候!
答案 0 :(得分:0)
您想要的是 CALL PRXNEXT
,它遍历匹配项。 PRXPOSN
标识捕获缓冲区,意思是一组 ( )
- 但不直接将多个匹配项匹配到一个捕获缓冲区。
这应该有效:
data have;
String1 =
"Report failed: FailType: FailLevel, FailDate 12.01.2016. InstanceType (name_of_type) -9234as-df32f-2f2f Error : Error_message1. Error : Error_message2. Error : Error_message3." ;
rx_err = prxparse ('/Error : (.*?)\./ios');
start = 1;
stop = length(String1);
do _i = 1 by 1 until (position le 0);
CALL PRXNEXT( rx_err, start, stop, String1, position, length);
if position gt 0 then do;
err_msg = substr(string1,position,length);
put position= length= err_msg=;
end;
end;
run;
如果错误消息中可以包含在 .
上停止匹配可能会有问题,但如果是这样,您必须找到更好的方法来停止它。
正则表达式的工作原理是使用 (.*?)
匹配所有字符,但不贪婪,因此当它遇到 \.
(句点)时它会停止。
如果您愿意,您可以在 PRXPOSN
之后使用 CALL PRXNEXT
,仅获取 ()
,我相信始终将 1
作为捕获缓冲区的值。因此,不要使用 err_msg
赋值,而是使用:
err_msg = prxposn(rx_err,1,string1);