正则表达式(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。