我有一个这种格式的文本变量
1234 09.07 USD 50.00 SOME RELEVANT TEXT
1234 09.07 USD 10000.00 SOME RELEVANT TEXT
我需要50.00美元之后的第一个字母的位置。在SAS中使用regexp,我可以找到我正在寻找的模式的起始位置,但是如何找到表达式的结束位置?问题是金额可能是50.00或10000.00,因此相关文本之前的结束位置会有所不同,尽管起始位置是相同的。
使用此表达式;
prxmatch('/\s\w{3}\s\d+\.\d+\s\w/' , myvar)
我可以找到USD部分的开头,但是如何在SOME RELEVANT TEXT部分之前获得该职位?在这个表达式中,我定义了“3个字母空间anynumberofdigits.anynumberofdigits space letter”。
我已经开始编写代码,我正在反转字符串,但我觉得我在这里错过了一个明显而简单的解决方法。
答案 0 :(得分:0)
如果我做对了,“一些相关的文字”匹配“所有非数字符号”:
/[^\d]+$/
<强>更新强> 如果“SOME RELEVANT TEXT”中允许使用数字,您可以通过以下方式修改初始正则表达式:
/\s\w{3}\s\d+\.\d+\s(.+)/
答案 1 :(得分:0)
对我而言似乎很简单。在这个例子中,我为了简单起见,使你的第一位看起来很正面(当然,如果你愿意,可以将它改为常规匹配)。
如果您想要更好的答案,请提供其他数据,如果这与您的数据不符。
data have;
infile datalines truncover;
input @1 textvar $100.;
datalines;
1234 09.07 USD 50.00 SOME RELEVANT TEXT
1234 09.07 USD 10000.00 SOME RELEVANT TEXT
;;;;
run;
data want;
set have;
_rx = prxparse('/(?:\s\w{3}\s\d+\.\d+\s)(.*)$/');
_rc = prxmatch(_rx,textvar);
RelevantText = prxposn(_Rx,1,textvar);
run;
答案 2 :(得分:-1)
这有效,但不太优雅。
我基本上颠倒了字符串并搜索了表达式的反转。这次制定字符串的整个第一部分,不仅是“3个字母空间anynumberofdigits.anynumberofdigits space letter”),因为有一些观察结果可以增加,与第一个相关文本部分中的第一个表达式相匹配
tmp1=strip(reverse(myvar));
pos = prxmatch('/\s\d+\.\d+\s\w{3}\s\d{2}\.\d{2}\s\d{4}\*/' , tmp1) ;
relevanttext= reverse(substr(tmp1,1,pos));