Regex 在SAS中将普通正则表达式转换为正则表达式

Regex 在SAS中将普通正则表达式转换为正则表达式,regex,sas,Regex,Sas,虽然阅读了SAS文档和各种示例页面,但我仍在努力将稍微复杂的正则表达式转换为SAS语法。我使用命令prxchange。这就是我到目前为止提出的在SAS数据步骤中,将文件名字符串(如pre31dec2019_299792458.xls转换为整数(长度为8)299792458: tmp=prxchange('s/pre_([a-zA-Z0-9]{8,9})_([0-9]{1,16})\.xls/\2/g',-1,have); want=input(tmp,8.); 我得到的错误消息指向代码中的其他

虽然阅读了SAS文档和各种示例页面,但我仍在努力将稍微复杂的正则表达式转换为SAS语法。我使用命令
prxchange
。这就是我到目前为止提出的在SAS数据步骤中,将文件名字符串(如
pre31dec2019_299792458.xls
转换为整数(长度为8)
299792458

tmp=prxchange('s/pre_([a-zA-Z0-9]{8,9})_([0-9]{1,16})\.xls/\2/g',-1,have);
want=input(tmp,8.);
我得到的错误消息指向代码中的其他地方,但我相当肯定,正是这两行导致了问题,因为省略这两行引号会使SAS错误消息消失

工具书类
  • 建议我可以使用标准正则表达式
您可以使用

tmp = prxchange('s/^pre_[A-Za-z0-9]+_([0-9]+)\.xls$/$1/', -1, have);

详细信息

  • s/
    -替换操作(我们正在替换匹配项)
  • ^
    -字符串的开头
  • 前缀
    -文字前缀
  • [A-Za-z0-9]+
    -一个或多个字母数字ASCII字符(注意,如果可能的话,您只需在此处使用
    *
  • -下划线
  • ([0-9]+)
    -第1组:一个或多个数字
  • 字符串末尾的
    \.xls$
    -
    .xls
  • $1
    -整个匹配项,即匹配的整个字符串,将替换为组1的内容
关于,请注意,当您将
-1
作为times参数传递时,它将替换所有出现的模式,因此,不需要
g
标志。

您可以使用

tmp = prxchange('s/^pre_[A-Za-z0-9]+_([0-9]+)\.xls$/$1/', -1, have);

详细信息

  • s/
    -替换操作(我们正在替换匹配项)
  • ^
    -字符串的开头
  • 前缀
    -文字前缀
  • [A-Za-z0-9]+
    -一个或多个字母数字ASCII字符(注意,如果可能的话,您只需在此处使用
    *
  • -下划线
  • ([0-9]+)
    -第1组:一个或多个数字
  • 字符串末尾的
    \.xls$
    -
    .xls
  • $1
    -整个匹配项,即匹配的整个字符串,将替换为组1的内容
关于,请注意,一旦您将
-1
作为times参数传递,它将替换所有出现的模式,因此,不需要
g
标志。

为什么要使用regex

want = input(scan(have,-2,'._'),32.);
为什么要使用正则表达式呢

want = input(scan(have,-2,'._'),32.);

您可以尝试多种方法:

data _null_;
a="pre_31DEC2019_299792458.xls";
b=input(prxchange('s/.*\_(.*)\..*/$1/',-1,a),12.);
c=input(prxchange('s/.*(\d{9}).*/$1/',-1,a),12.);
d=input(prxchange('s/.*(?<=\_)(\d+).*/$1/',-1,a),12.);
put _all_;
run;
数据\u空\u;
a=“2019年12月31日前\u 299792458.xls”;
b=输入(prxchange('s/*\\(.*)\..*/$1/',-1,a),12.);
c=输入(prxchange('s/*(\d{9})。*/$1/',-1,a),12.);

d=输入(prxchange('s/*(?您可以尝试的许多方法:

data _null_;
a="pre_31DEC2019_299792458.xls";
b=input(prxchange('s/.*\_(.*)\..*/$1/',-1,a),12.);
c=input(prxchange('s/.*(\d{9}).*/$1/',-1,a),12.);
d=input(prxchange('s/.*(?<=\_)(\d+).*/$1/',-1,a),12.);
put _all_;
run;
数据\u空\u;
a=“2019年12月31日前\u 299792458.xls”;
b=输入(prxchange('s/*\\(.*)\..*/$1/',-1,a),12.);
c=输入(prxchange('s/*(\d{9})。*/$1/',-1,a),12.);

d=输入(prxchange('s/)*(?可以,你可以分享错误消息吗?这是最高军事机密还是什么?我对SAS或此函数一无所知,但你的字符串包含大写字母,而你的模式搜索小写字母,导致不匹配。可能这会导致错误?你的输入字符串的格式有多好?你只需要前8个字符吗标记文件扩展名的句点?或者某些值的位数不同?或者是非位数?您的正则表达式试图捕获整个字符串,但您对捕获组2感兴趣,但我没有看到任何代码专门访问该捕获组,因此您基本上是在验证字符串s的预期格式,并尝试从整个字符串中创建一个整数?
\d+(?=\.xls)
将只提取整数部分
299792458
SAS空间将变量填充到变量长度,因此需要
修剪(have)
或将
\s*$
添加到你的正则表达式模式的末尾。你能,你能分享错误消息吗?这是最高军事机密还是什么?我对SAS或这个函数一无所知,但你的字符串包含大写字母,而你的模式搜索小写字母,结果不匹配。也许这会导致错误?你的格式有多好您的输入字符串?您是否只需要标记文件扩展名的句点之前的最后8个字符?或者某些值的位数不同?或者没有位数?您的正则表达式正在尝试捕获整个字符串,但您对捕获组#2感兴趣,但我没有看到任何代码专门访问它捕获组,以便您基本上验证字符串是否为预期格式,并尝试从整个字符串中创建一个整数?
\d+(?=\.xls)
将仅提取整数段
299792458
SAS空间将变量填充为可变长度,因此需要
修剪(have)
或将
\s*$
添加到您的正则表达式模式的末尾。这一点很好(像往常一样),但我很想了解如何在SAS中使用
[a-z]{1,4}
语法。这一点很好(像往常一样),但我真的很想了解如何使用
[a-z]{1,4}一般来说,SAS中的语法。谢谢你的台词。我最大的问题不是正则表达式,而是如何执行
[abc]{1,2}
在SAS'
prxchange
中。它真的是对常用正则表达式的一对一吗?这意味着这里的表达式将搜索SAS中的任何组合
a、b、c、aa、ab、ac、ba、bb、bc、ca、cb、cc
?@b--rian是的,
[abc]{1,2}
匹配
a
b
c
中的一个或两个匹配项。谢谢你的台词。我最大的问题不是正则表达式,而是如何执行
[abc]{1,2}
在SAS'
prxchange
中。它真的是一对一到通常的正则表达式吗?这意味着这里的表达式将搜索SAS中的任何组合
a、b、c、aa、ab、ac、ba、bb、bc、ca、cb、cc
-