正则表达式的敏感性和特殊性

Posted by admin | 正则表达式, 原创, 转载 | 星期六 28 7月 2007 10:07 下午

敏感性和特殊性这两个概念来源于像统计学和流行病学这样的学科中的量化标准。宽泛地说,敏感性可以用实际找到的匹配项中的正确匹配项数除以在匹配全部相关字符序列的情况下应该找到的匹配项数来度量。而特殊性则可以用实际找到的匹配项中的正确匹配项数除以找到的匹配项总数来表示。在使用正则表达式时,敏感性越高,则表明找到的真正匹配项数量越接近要找的全部匹配项;而特殊性越高,则表明找到的匹配项中正确的匹配项越多。

匹分敏感性和特殊性的关键是要明确三个数量:正确的找到的要找的。根据上面的定义,敏感性是指用正确的除以要找的,这个比例越高说明正则表达式越敏感--比如要找 100 个,实际找到了 150 个,而其中有 100 个是正确的,那么敏感性就是 100%;而特殊性则是指用正确的除以找到的,这个比例越高说明正则表达式越特殊<即更具有针对性>--比如上面说找到的 150 个当中有 100 个是正确的,那么特殊性就是 66.67%。所以可以理解为敏感性是从量的角度衡量匹配目标的完成情况,而特殊性则是从质的角度来衡量匹配目标的完成情况。

试验一下:电子邮件地址

1. 打开 PowerGrep,在 Search 文本区域中输入模式 \w*(?<=\w)\.?\w+@.*

2. Folder 文本框中输入文件夹名 C:\BRegExp\Ch09 。如果你把下载的测试文件放在其他地方,请修改这里的路径。

3. File mask 文本框中输入文件名 emailornotemail.txt,并单击 Search 按钮。

4. Results 区域中观察结果,如下图所示。

email_1.gif

这是一次进步,而模式也更加具有特殊性。因为这次没有匹配第 127 8 行中不想要的字符序列。然而,第 3 行中的字符序列 John@somewhere.invalid,并不是一个有效的电子邮件地址。

可以通过将电子邮件地址的域名部分更加特殊化来排除这个不想要的匹配项。众所周知,所有的域名都是字母字符序列后跟一个句点字符,然后跟着三(comnetorg biz)或四(info)个字母字符。在本例中,我们先不考虑 example.co.uk 这样的域名。那么,下面的模式可以作为与刚刚描述的结构对应的一个适当的模式:

\w+\.\w{3,4}

其中 \w+ 甚至会匹配单个字符的域名(.com.net .org 域名允许使用单个字符)。而 \. 转义序列匹配一个句点字符,\w{3,4} 则匹配三或四个字母字符。

将这个模式与前面使用的模式组合起来就是:

\w*(?<=\w)\.?\w+@\w+\.\w{3,4}

5. Search 文本区域中输入模式 \w*(?<=\w)\.?\w+@\w+\.\w{3,4},并单击 Search 按钮。

6. 观察结果。注意第 3 行中不想要的匹配项这次没有匹配。然而,在第 6 行中一个前面没有提及的问题却浮出水面。第 6 行中的电子邮件地址中包含两个 @ 字符,而这是不允许的。

要解决这个问题一种方法是使用向前查找限定在匹配第一个 @ 字符后,不允许后面出现另一个 @ 字符。如果我们继续假设在电子邮件地址中只允许使用字母字符,那么就可以通过向前查找来限定在第一次匹配非字母字符或句点字符之前只有一个 @ 字符。

可以通过下面的模式实现这种限定:

\w*(?<=\w)\.?\w+@(?=[\w\.]+\W)\w+\.\w{3,4}

7. Search 文本区域中把模式修改为 \w*(?<=\w)\.?\w+@(?=[\w\.]+\W)\w+\.\w{3,4},并单击 Search 按钮。

8. 观察结果。结果如下图所示。

email_2.gif

遗憾的是,向前查找并没有解决第 3 行和第 6 行中不想要匹配的问题。我们还需要限定模式要匹配的是一行中的全部文本。换句话说,要添加 ^ 元字符指定一行的开始位置和 $ 元字符指定该行的结束位置。

9. Search 文本区域中把模式修改为 ^\w*(?<=\w)\.?\w+@(?=[\w\.]+\W)\w+\.\w{3,4}$,并单击 Search 按钮。

10. 观察结果。结果如下图所示。

email_3.gif

令人高兴的是,这次成功地排除了第 3 行和第 6 行中不想要的匹配项。至少在这个简单的测试数据文件中,我们获得了 100% 的敏感性和 100% 特殊性。

敏感性和特殊性这两个概念来源于量化研究的科学,比如统计学和流行病学。在这两种学科中,都是用数字来表示敏感性和特殊性的,而且通常使用百分比。因此,对于前面的例子来说,因为使用第一个正则表达式模式时找到了所有正确的电子邮件地址,所以敏感性达到了 100%;而因为 10 个匹配结果中的 6 个(从不是有效的电子邮件地址的角度来说)都是错误的匹配,所以特殊性仅有 40%。而到了该例子的最后,修改后正则表达式的特殊性也上升到了 100%

没有评论 »

还没有评论。

对这篇文章的评论的 RSS 聚合。 TrackBack URI

发表您的评论

验证码  If you cannot see the CheckCode image,please refresh the page again!