基于正则表达式的模糊查询和数据匹配验证
作者:杨成科
来源:《电脑知识与技术·学术交流》2008年第29
        摘要:正则表达式是编译原理的核心理论之一,应用于各程序设计语言的编译系统中,以分析程序源代码中的各种记号。从程序设计的角度来看,正则表达式常常被用于设计模糊查询程序和数据匹配验证程序。
        关键词:正则表达式;编译原理;模糊查询;数据匹配验证
        中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)29-0411-02
        Fuzzy Query and Data Validations Based on Regular Expression
        YANG Cheng-ke1,2
        (1.Northwest Normal University,Lanzhou 730070,China;2.Gansu Economy School,Lanzhou 730050,China)
        Abstract: Regular expression is a core principle of the theory compiling, applies to every compiling system of the programming language, analysis various sign of procedure source code. Regular expression often used in the design of data validations procedures or fuzzy query procedures.
        Key words: regular expression; theory compiling; fuzzy query; data validations
       
        1 引言
       
        随着因特网的普及,基于Web站点的模糊查询和输入数据的格式匹配验证在网络中的应用非常广泛。比如使用搜索引擎在整个Web站点中搜索包含输入关键字的信息;验证输入的值是否与某种可预知的字符序列相匹配,如身份证号码、地址、电话号码、等字符序列。这些包含输入关键字的信息和可预知的字符序列可以用正则表达式所定义的模式来描述。
        本文简要介绍了正则表达式及其运算,并从程序设计的角度分析了正则表达式在设计模糊查询程序和数据匹配验证程序方面的应用。
       
        2 正则表达式及其运算
       
        正则表达式是编译原理中用来描述字符串格式的一种文本模式,这种文本模式完全由它所匹配的串集来定义;与程序设计语言中的表达式类似,正则表达式也是由运算对象和运算符组合而成,只不过其运算对象是基本正则表达式,运算符是一些具有运算含义的元字符而已。因此,充分理解正则表达式中具有运算含义的元字符,是我们正确使用正则表达式的首要条件。
        不同的编程工具和软件环境所支持的正则表达式的扩展运算和元字符有所不同。所以我们在使用时,必须根据应用的软件环境注意区分。正则表达式有3种基本运算和若干个扩展运算。下面介绍3种基本运算,有关扩展运算的介绍参见文献[1]
        1) 选择:从多个选择对象中选择其一,用元字符“|”(竖线)表示。例如:正则表达式a|b匹配了a b 中的任一字符。
        2) 连结:由并置表示(不用元字符)。例如:正则表达式ab只匹配ab
        3) 重复:正则表达式的重复也称为闭包,由元字符“*”表示。例如:a*匹配串ε(空串)、aaaaaa . . .
        3种基本运算的优先顺序是: 重复运算*优先权最高,连结其次,选择运算|最低。另外,使用括号可以改变它们的优先顺序。
       
        3 正则表达式用于模糊查询
       
        SQL语言的查询语句通常使用LIKE关键字实现简单的模糊查询,其中用到的通配符就是正则表达式的元字符,由于SQL语言本身支持的通配符少、功能较弱, 所以不同的数据库产
品在标准SQL的基础上都有所扩展,在此以Oracle Database为例来介绍正则表达式在模糊查询方面的应用。
        Oracle中用于正则表达式运算的有 REGEXP_LIKE操作符和 REGEXP_INSTRREGEXP_SUBSTR以及REGEXP_REPLACE函数。被搜索的数据既可以是简单的字符串,也可以是存储在数据库字符列中的大量文本。Oracle 的正则表达式支持 POSIX字符类, POSIX 字符类必须包含在一个由方括号 ([ ])指示的字符列表中,其中的元字符类似于命名的正则表达式,这样写出的正则表达式比较特别,可以包含控制字符一类的特殊字符。
        Oracle支持的正则表达式元字符也有所变化,其中表达式首部的元字符“^” 表示一行正则表达式的开始,元字符“$”表示正则表达式一行的结尾;还用“{m}”表示前面的符号重复m, “{mn}”表示前面的符号有最少m次最多n次的重复,a(b|c|d)e这样的正则表达式还可以表示为a[bcd]e,匹配abe,ace, ade。另外,元字符“^”和元字符“-”还具有二义性,表达式首部的元字符“^”表示一行正则表达式的开始,而一个字符列表首部的元字符“^”代表非。因此,^[[:digit:]] 匹配以数字开始的模式,而[^[:digit:]] 匹配包含了任意非数字字符的模式。连字符 “-” 指示一个范围,正则表达式 [a-m] 匹配字母 a 到字母 m 之间的任意字母。但如果它是一个字符行中的第一个字符(如在 [-afg] 中),则它就代表连字符。
        使用REGEXP_LIKE操作符可以实现较为复杂的模糊查询,如例1
        1:在户籍管理中,根据身份证号查出生于19888月的兰州市居民。
        SELECT *
        FROM Personal_Inf
        WHERE REGEXP_LIKE(Pno,’^62010[[:digit:]]((198808[[:digit:]]{6})|(8808[[:digit:]]{5}))$’)
        REGEXP_SUBSTR函数可以提取一个字符串与正则表达式相匹配的部分, REGEXP_INSTR 函数返回一个模式的起始位置, REGEXP_REPLACE函数用指定的字符串来替换匹配的模式。因篇幅所限,相关语法格式和功能描述请参阅文献[2]
       
        4 正则表达式用于匹配验证
       
        Visual Studio通过System.Text.RegularExpressions 命名空间包含的一些类提供对正则表达式的支持,并且支持的元字符更加丰富、功能更加强大,所构造的模式也比较复杂,2列出了部分元字符和它们在正则表达式上下文中的功能描述。
        Web 站点设计中,我们常常要设计用户注册程序。要求用户输入用户名、密码、身份证号码、地址等信息,同时要验证输入的这些字符串是否符合相关的模式,比如密码是否在六位以上、地址是否符合格式等等。ASPRegularExpressionValidator 控件用于验证输入控件的值是否与某个正则表达式所定义的模式相匹配。该控件的ValidationExpression 属性指定用于验证的正则表达式,客户端的正则表达式验证语法和服务器端略有不同。在客户端,使用的是 JScript 正则表达式语法。而在服务器端使用的则是 Regex 语法。由于JScript 正则表达式语法是 Regex 语法的子集,所以最好使用 JScript正则表达式语法,以便在客户端和服务器端得到同样的结果。
       
        2: 验证地址格式的合法性。
        %@page clienttarget=downlevel%
        html
        body
        h3 验证地址的例子</h3
        form runat="server"
        table bgcolor="#eeeeee" cellpadding="10"
        td align="right" 请输入地址:/td正则化正交匹配追踪
        td><asp:TextBox id="TextBox1" runat="server"/></td
        asp:RegularExpressionValidator id="RegularExpressionValidator1"
        ControlToValidate="TextBox1"
        ValidationExpression="^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[[A-Za-z0-9]+)*\.[A-Za-z0-9]+$"
        Display="Static"
        ErrorMessage="地址错误!"
        EnableClientScript="False"
        runat="server"
        /asp:RegularExpressionValidator
        tr><td asp:Button text="验证" runat=server / /td /tr
        /table
        /form
        /body
        /html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。