SAS正则表达式笔记
SAS通过PRX系列函数(如PRXPARSE、PRXMATCH)支持正则表达式,用于高效匹配、查找、提取和替换文本模式,构成正则表达式语句的主要结构是元素和函数。
常用元素
构成正则表达式的语句有很多元素:
-
.(点): 匹配除换行符外的任意单个字符。 -
\d: 匹配任意一个数字 (等同于[0-9])。 -
\w: 匹配任意一个单词字符 (字母、数字或下划线)。 -
\s: 匹配任意一个空白字符 (空格、制表符等)。 -
^: 匹配字符串的开头。 -
$: 匹配字符串的结尾。 -
[…]: 匹配方括号中包含的任意一个字符。例如[abc]匹配 "a", "b", 或 "c"。 -
(…): 将模式分组,作为一个单元使用。 -
*: 匹配前面的元素零次或多次。 -
+: 匹配前面的元素一次或多次。 -
?: 匹配前面的元素零次或一次。 -
|: 或逻辑操作符。例如a|b匹配 "a" 或 "b"。
这些元素可以不用刻意记,在后面的代码中边练边记、边用边记就好。
常用函数
除了上述需要了解的基本元素,我们还需要知道SAS中几个常用的正则表达式相关函数:
PRXPARSE
解析表达式用的,一般认为是执行后续的第一步,程序里常用prxparse(pattern)构建一个语句,再放在其他函数里用。实际上直接写语句不用prxparse也是可以的。
写正则表达式的步骤:
-
先写一个冒号:
'' -
在冒号里面加两个斜杠:
'//' -
接下来在斜杠里面输入需要匹配的模式即可
-
两个
//是需要匹配的内容,如果涉及符号、数字等就用【\】来进行转译。
比如匹配多个数字就是:'/\d+/'
匹配冒号:'/:/'
示例
/* 再比如匹配+和后面的一堆数字:*/
DATA _NULL_;
text = "Product_ID: 12345";
/* 解析模式 */
pattern_id = PRXPARSE('/\d+/');
/* 检查是否匹配 */
match_pos = PRXMATCH(pattern_id, text);
IF match_pos > 0 THEN PUT "字符串中找到了数字,起始位置在: " match_pos;
ELSE PUT "字符串中没有找到数字。";
RUN;
PRXMATCH
用来检查指定字符串是否在变量中存在,如果存在就返回匹配开始的位置,否则为0。
示例1:找到指定字符的位置
DATA _NULL_;
text = "Product_ID: 12345";
/* 解析模式 */
pattern_id = PRXPARSE('/\d+/');
/* 检查是否匹配 */
match_pos = PRXMATCH(pattern_id, text);
IF match_pos > 0 THEN PUT "字符串中找到了数字,起始位置在: " match_pos;
ELSE PUT "字符串中没有找到数字。";
RUN;
示例2:条件判断
在做SDTM数据集的时候prxmatch有一个很实用的点:if prxmatch('/(y|yes)\s*/i',tuyn_std);
用正则表达式可以将[y|Y|yes|Yes|YES]等等很多种情况的判断到。