正则表达式之贪婪匹配 VS 非贪婪匹配

我们知道,许多程序设计语言都支持利用功能强大的正则表达式进行字符串操作,SAS中也有用正则表达式的PRX Function,平时在写正则表达式的时候会常碰到贪婪匹配与非贪婪匹配的问题。

贪婪匹配是指在保证后面的表达式都能匹配上的前提下尽可能多匹配,如有字符串STRING='Table 1.1 Subject Disposition including Screening Failures - All Screened Subjects                     3';

表达式:

"s/(Figure|Listing|Table)\s(.+)\s(.+)\s+\d/"

对于第二个括号,因为是贪婪匹配,可以理解为先匹配到字符串结尾,然后因为要保证后面的表达式都能匹配上,就从右往左“分配”(实际匹配顺序是从左往右),\d对应为3,\s+对应为紧挨3之前的一个空格(记为空格1),第三个括号(.+)对应为紧挨空格1前面的一个空格(记为空格2),\s对应为紧挨空格2前面的一个空格(记为空格3),那第二个括号匹配的就是1.1 Subject Disposition including Screening Failures - All Screened Subjects + Subjects与数字3之间除了空格1、2、3外的空格(如果这之间的空格数大于3)。

当然,这是对应原字符串数字3前面至少有3个空格,如果少于三个的话结果就变了,例如原字符串数字3前面只有有2个空格,即:STRING='Table 1.1 Subject Disposition including Screening Failures - All Screened Subjects  3'; 表达式同上,则结果就是:对于第二个括号,因为是贪婪匹配,可以理解为先匹配到字符串结尾,然后因为要保证后面表达式都能匹配上,就从右往左“分配”(实际匹配顺序是从左往右),\d对应为3,\s+对应为紧挨3之前的一个空格,第三个括号(.+)对应为Subjects+紧随其后的空格,\s对应为紧挨Subjects前面的一个空格,那第二个括号匹配的就是1.1 Subject Disposition including Screening Failures - All Screened。

非贪婪匹配是在保证后面的表达式都能匹配上的前提下尽可能少匹配。

曾宪华 /
本文采用 署名-非商业性使用-相同方式共享 3.0许可协议 属于 程序人生 分类, 被贴了 Regular Expression 正则表达式 书签

上一篇 关于老Z的博客
下一篇 .sas7bdat文件与.xpt文件批量转换