在正则表达式结尾处找到位置

时间:2016-09-06 10:52:20

标签: regex sas

我有一个这种格式的文本变量

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”。

我已经开始编写代码,我正在反转字符串,但我觉得我在这里错过了一个明显而简单的解决方法。

3 个答案:

答案 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));