vlambda博客
学习文章列表

第2章:使用Perl正则表达式检测数据错误

1.正则表达式:

用一种叫做Perl的语言引入的,它是为UNIX和Linux系统开发的。从SAS9.0开始,将Perl正则表达式添加到SAS中。它们被用于描述文本模式。例如,您可以编写一个与社会安全号码(三个数字、一个破折号、两个数字、一个破折号和四位数)相匹配的表达式。因此,您可以使用正则表达式来测试是否存在特定的模式。回顾第1章,希望确保诊断代码由三位数字,一个句点,然后是三位数字组成。虽然可以使用SAS字符函数来实现这一点,但使用正则表达式要简单得多。正则表达式(由程序员称为regex)以分隔符(通常是正斜杠)开头,后面是字符和元字符的组合。meta-character描述字符类,如所有数字或所有标点符号。表达式以相同的分隔符结束。


例如,一个社会安全号码的正则表达式是:

\d is the meta-character for any digit.

等效于第2章:使用Perl正则表达式检测数据错误


例子:

在SAS中,所有的正则表达式函数都以字母PRX(Perl正则表达式)开头。

编写一个程序来检查患者数据集中的Dx代码是否满足所需的模式。

第2章:使用Perl正则表达式检测数据错误


第2章:使用Perl正则表达式检测数据错误


prxmatch函数包含两个参数。第一个参数是正则表达式,第二个参数是您正在检查的字符串。如果字符串包含正则表达式描述的模式,则函数返回模式的起始位置。如果在字符串中找不到正则表达式描述的模式,则函数返回0。在上面程序中,正则表达式描述了一个三位数字,一个句点,后跟三位数字的模式。


请注意上面正则表达式中句点之前的反斜杠(\)。如前所述,正则表达式中的某些字符具有特殊的含义。句号是那些特殊字符之一,它代表任何字符(有时被称为通配符)。为了指定要查找的是句点,而不是字符的占位符,请将反斜杠字符放在句点之前。这个反斜线称为转义字符,它表示将以下字符视为一个字符,而不是该字符通常描述的特殊含义。


当测试一个无效的Dx代码时,找不到该模式,并且函数返回一个0。当找到一个有效的模式时,函数返回一个1(因为所有的Dx代码都在字符串的开头开始)。因此,将为所有不匹配该模式的Dx代码写入错误消息。以下是输出:


第2章:使用Perl正则表达式检测数据错误


2.检查有效的邮政编码和加拿大邮政编码

第2章:使用Perl正则表达式检测数据错误

这个表达式的第一部分非常清楚——搜索5个数字。圆括号中的表达式与一个破折号后跟四位数字相匹配。括号后面的问号表示搜索前一个表达式的0或1次出现。因此,此表达式匹配两种有效的美国邮政编码格式中的任何一种。

第2章:使用Perl正则表达式检测数据错误


加拿大的邮政编码

要复杂一些。有效的加拿大邮政编码采用以下两种可能的形式中的一种:第2章:使用Perl正则表达式检测数据错误


其中,L是一个字母,而d是一个数字。并不是所有的字母表都是允许的。字母D、F、I、O、Q和U从未被使用(被禁止的6个)。邮政编码的第一个字母也不能是W或z。因此,为加拿大邮政编码编写一个正则表达式有点棘手。最简单的表达式:

第2章:使用Perl正则表达式检测数据错误


忽略了被禁止的字母,但可用于验证代码的基本形式。表达式中的空格和问号允许没有空格或代码中间的一个空格。一个更准确的表达式是:

第2章:使用Perl正则表达式检测数据错误


解释:

  • 方括号中的字母列表意味着这些字符中的任何一个在该位置上都是有效的。

  • 第一个字母列表不包含6个被禁止的字符或W或Z。

  • 使用了表达式[0-9],而不是使用\d来表示任何数字。\d和[0-9]之间的区别只有在单节点编码而不是ASCII的文件下才会出现。结果是,在使用非ASCII编码时,有一些与\d匹配的字符并不是您所认为的数字。

  • 另外两个字母列表包括了字母表中所有的字母,除了被禁止的六个字母。问号后面的空格允许在代码中间有一个空格或没有空格。


第2章:使用Perl正则表达式检测数据错误


第2章:使用Perl正则表达式检测数据错误


第2章:使用Perl正则表达式检测数据错误

上面的表达式使用句点(任何字符的占位符)和加号复制运算符。加号表示要重复前面的表达式一次或更多次。因此,这个表达式几乎只匹配任何带有@符号的字符串。

第2章:使用Perl正则表达式检测数据错误



第2章:使用Perl正则表达式检测数据错误

第2章:使用Perl正则表达式检测数据错误



第2章:使用Perl正则表达式检测数据错误


第2章:使用Perl正则表达式检测数据错误



6.开发一个宏来测试正则表达式

第2章:使用Perl正则表达式检测数据错误


第2章:使用Perl正则表达式检测数据错误

第2章:使用Perl正则表达式检测数据错误




来源: