正则表达式已经有不少人写过了,我写这个系列文章的目的主要是因为正则我用的很少很少,很多这方面的东西都不清楚。我对这些工具都是能用就行,SAS的函数和语句能解决问题,简单又方便,为什么还要用正则呢?
但是听到别人在讲正则,你却连基本的东西都不懂,傻站在一边,就像讲到统计的P值,置信区间,σ,α,也是别人讲到你却不清楚是干什么用,还是傻站在一边,你可以不用,但是不能不懂。所以不是会写个SDTM、ADaM、TFL就是了,要学的东西太多了。
正则表达式:regular expressions (RegEx)
RegEx由字母、数字、元字符和特殊字符组成,这些字符构成模式,为了使SAS正确地解释这些模式,所有RegEx值都必须用 "分隔符对" 封装起来,比如下面这样(省略号就是pattern)
/......../
假设我们想搜索字符“street”,那么pattern就是/street/
元字符(Metacharacter):元字符是诸如SAS之类的编程语言用于的一个字符或一组字符,比如 \s在正则表达式里面代表空白字符。
特殊字符:在正则表达式里面,有以下特殊字符:
() 这对圆括号代表创建模式字符和元字符的逻辑组,尤其是你在创建复杂的pattern的时候,运用这个括号是很重要的。
| 这个竖线代表 or 的意思
\ 这个右斜杠代表它被用作其他元字符(Metacharacter)的组成部分,比如上面的\s,这是第一个作用;另一个作用就是运用这个之后,比如前面的两个特殊字符,就能告诉SAS它就是普通的字符,而不是什么特殊字符,你给我把这普通的字符输出就好了。
了解这些基本的东西,我们直接看实例吧,看看SAS中的函数对应正则表达式的哪些东西:
①:prxmatch:匹配字符(pattern)并返回第一个匹配到的pattern所在的位置,类似于index函数和find函数。
语法:PRXMATCH(RegEx_ID or RegEx, Source_Text)
需要注意第一个参数,需要用引号括起来,并用/..../存放你的表达式(省略号就是表达式)。
注意到prxmatch('/(大|吃|寒|冒)/', var2),即使我先把‘吃’放在前面,它匹配到的也是‘冒’的位置,所以跟放的顺序无关,同时注意我用了(),前面讲了()的作用,就是添加逻辑组,换句话说就是匹配括号内的表达式并将其分组,将括号里的字符当作一个单独的单元。但是在上面的例子中发现不加也是能同样匹配出来的。
关于这个括号的用法,我再举一个例子:
还有\的作用,我这也举一个例子
大家可以先尝试一下把index换成prxmatch去匹配字符,可以看到如果你用or去匹配的话,要写好几个index,所以用prxmatch一大好处就是看起来简洁一些。
一步一步来,今天就先介绍prxmatch,后续还有好几个函数。