正则表达式大家已经非常熟悉,这里不是教大家怎么用,而是说明如何用代码实现正则表达式。该篇先理清正则表达式的组成结构:
1、正则表达式描述的是一个字符串的匹配模式,本质上是一个字符串的集合,如果给定的字符串属于该集合就说明该字符串与模式相匹配;(比如在谈谈KMP算法中提到的判断某个长文本是否包含指定关键字的场景就是分析长文本的子串是否包含在模式描述的集合中,本质上是模式匹配问题,更确切的讲应该是单模式匹配,因为以后还要提到多模式匹配问题。这同样也解释了为什么把简单的字符串查找问题说成一个高大上的模式匹配问题的原因(至少我个人以前是这么认为的))
2、再次强调以集合的观点来看待正则表达式,以上提到了集合,那么“(空)”是属于任何集合的,也就是说空本身就是一个正则表达式;
3、先认识简单的正则表达式。任何单个字符都可用正则表达式表示,表示的方式多种多样:
(1)简单的字符常量如:字母、数字、标点符号以及一些空白符(常见的如\t\n\r,不常见的自己查吧)
(2)字符常量表示的正则表达式是单一的因为集合中只有自身,因此有很多灵活的表示方法如:
\d、[0-9]表示0-9的数字,[]可以用来表示更个性化的情况如[135]表示只能是1、3、5这3个数字中的一个;
\D、[^0-9]、[^\d]表示非数字字符;
\w、[_0-9a-zA-Z]表示所有的大小写字母、数字与下划线;
\W、[^\w]、[^_0-9a-zA-Z]表示除大小写字母、数字与下划线的其它字符;
\s、[ \t\n\r]表示空白字符;
\S、[^\s]、[^ \t\n\r]表示除 \t\n\r空白符的其它字符;
.可以表示除\n外的任何字符
(3)连接运算符是一个隐藏的运算符,将两个正则表达式按照顺序并列写出即可,表示的是两个集合的笛卡尔积,比如:ab、a\d、\d\s等等,注意只要是合法的正则表达式就可以连接,这实际上是一个递归的思想,在后面的某些运算中一样适用;
(4)或运算(|)表示两个正则表达式所组成集合的并集,如:a|b、\s|\S、a|ab,需注意或运算的优先级小于连接;
(5)括号()运算用于改变优先级如:(a|b)c表示集合{ac,bc},很明显括号有最高的运算优先级;
(6)次数运算符,用于描述正则表达式重复出现的次数,如:a?,a+,a*分别表示a可出现0次或1次,a至少出现1次,a可出现0次或多次。也可精确指出匹配的次数:a{4}表示a只能出现4次,a{4,7}表示可出现4-7次,a{4,}表示至少出现4次;次数运算符的优先级高于连接运算;
(7)边界匹配符,如^匹配行的开头,$匹配行的结尾,\b匹配单词与空格的边界,\B与\b相反;