跳至主要內容

正则表达式(Regex)

西风逍遥游大约 2 分钟

正则表达式(Regex)

正则表达式是一种常用的字符串匹配技术,正则表达式可以简单的规则描述正则文法,用来匹配很多常见的字符串。

从实用角度出发

试想,假如你正在写一个在线应用,如果你要编写一段代码来检测用户输入的邮箱是否为学校email,即结尾为.edu的邮箱,用来判断您的网站是否应该给他一个学生优惠价格。 一种简单的校验方法可能是编写一段代码来匹配:

    // a function to match edu email
    function isEduEmail(email) {
        bool endWithEdu = email.endsWith('.edu');
        bool includeAt = email.includes('@');
        return endWithEdu && includeAt;
    }

这段代码其实是有问题的,因为其并不能保证这个邮箱是合法的,比如@符号前面没有字符@abc.edu,或者@后面直接跟.edu xxx@.edu

一种更好的方式是去描述邮箱的文法规则:

<email_user>@<email_domain>.edu[.cn]

其中<email_user>是由字母、数字、下划线、点号组成的字符串,不能为空,<email_domain>是由字母、数字组成的字符串,也不能为空。最后还有可选的.cn后缀。

那么,一种简便地描述该文法的表示方法就是正则表达式:

/[A-Za-z0-9_.]+@[A-Za-z0-9]+.edu(.cn)?/

其中[A-Za-z0-9_.]+表示一个由字母、数字、下划线、点号组成的字符串,@表示一个@符号,[A-Za-z0-9]+表示一个由字母、数字组成的字符串,\.表示一个点号,edu表示一个edu字符串,(\.cn)?表示一个可选的.cn字符串。`

这里\.要用转义字符来表示.字符,是因为.在正则表达式中有特殊含义,表示任意非换行字符。

正则表达式的规范表述

正则表达式在词法分析中的应用

词法分析器的生成工具,如flex,re2c等,都是让用户定义一系列有优先级的正则表达式列表。而词法分析器会根据这个列表进行匹配,选择最长,最高优先级的匹配结果。 而每个正则式匹配后,都可以触发对应的动作,从而可以用来生成一个对应的token。