Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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_Sas - Fatal编程技术网

Regex 在正则表达式末尾查找位置

Regex 在正则表达式末尾查找位置,regex,sas,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}

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

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) 
我可以找到美元部分的开头,但如何在相关文本部分之前找到位置?在这个表达式中,我定义了“3个字母空格anynumberofdigits.anynumberofdigits空格字母”

我已经开始写代码,我正在反转字符串,但我觉得我在这里缺少了一个明显的、简单的解决方案。

如果我做对了,“一些相关的文本”匹配“从末尾开始的所有非数字符号”:

更新: 如果“某些相关文本”中允许使用数字,则可以通过以下方式修改初始正则表达式:

/\s\w{3}\s\d+\.\d+\s(.+)/

这是可行的,但不是很优雅

我基本上反转了字符串并搜索表达式的反转。这次构造字符串的整个第一部分,不仅是“3个字母空格anynumberofdigits.anynumberofdigits空格字母”),因为有一些观察结果与某些相关文本部分中的第一个表达式相匹配,而且是递增的

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

对我来说似乎很简单。在本例中,为了简单起见,我将您的第一点作为积极的回顾(当然,如果您愿意,可以将其更改为常规匹配)

如果您想要更好的答案,请提供其他数据,如果这与您的数据不匹配

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;

问题是,一些相关文本可能包含一个干净的tekst,如SPOTIFY或WAYNES COFFE,但也可能是PVP 17.5公里,西班牙。如果我没有弄错的话,你的建议是不会承认的。好的,我理解。然后可以这样修改正则表达式:/\s\w{3}\s\d+\.\d+\s(+.+)/在某些相关的文本部分中似乎允许使用所有字符,这使事情更加复杂。不过我确实找到了一个麻烦的解决方案。请看下面的答案。我不认为这是一个特别好的解决方案。你可以用这种方式使用的任何正则表达式都有一个不可逆的解决方案。完全同意,不是特别好,但它是有效的。我会试试你的建议。
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;