SAS通过PRX系列函数(如PRXPARSE、PRXMATCH)支持正则表达式,用于高效匹配、查找、提取和替换文本模式,构成正则表达式语句的主要结构是元素和函数。

常用元素

构成正则表达式的语句有很多元素:

  • .(点): 匹配除换行符外的任意单个字符。

  • \d: 匹配任意一个数字 (等同于 [0-9])。

  • \w: 匹配任意一个单词字符 (字母、数字或下划线)。

  • \s: 匹配任意一个空白字符 (空格、制表符等)。

  • ^: 匹配字符串的开头。

  • $: 匹配字符串的结尾。

  • […]: 匹配方括号中包含的任意一个字符。例如 [abc] 匹配 "a", "b", 或 "c"。

  • (…): 将模式分组,作为一个单元使用。

  • *: 匹配前面的元素零次或多次。

  • +: 匹配前面的元素一次或多次。

  • ?: 匹配前面的元素零次或一次。

  • |: 或逻辑操作符。例如 a|b 匹配 "a" 或 "b"。

这些元素可以不用刻意记,在后面的代码中边练边记、边用边记就好。

常用函数

除了上述需要了解的基本元素,我们还需要知道SAS中几个常用的正则表达式相关函数:

PRXPARSE

解析表达式用的,一般认为是执行后续的第一步,程序里常用prxparse(pattern)构建一个语句,再放在其他函数里用。实际上直接写语句不用prxparse也是可以的。

写正则表达式的步骤:

  1. 先写一个冒号:''

  2. 在冒号里面加两个斜杠:'//'

  3. 接下来在斜杠里面输入需要匹配的模式即可

  4. 两个//是需要匹配的内容,如果涉及符号、数字等就用【\】来进行转译。
    比如匹配多个数字就是:'/\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]等等很多种情况的判断到。