[TOC]
简述
正则表达式就是regular expression,简写是regex或者regexp。
正则表达式就是用一组特定字符串来描述一段文本规律,用来查找文本用的,对我来说的话就是在编辑器里面用用。
预热
正则表达式历史悠久,版本众多。细看之下,Vim和Emacs的正则表达式还各有不同的,跟网上找的文档里面也不一样。
推测
regex是使用字符串对文本内容实现查找,这里可以推测一个regex的最小实现就是:输入源文本和regex字符串,输出匹配regex的文本位置。
regex可以实现强大的搜索功能,细想之下,在这个基础上可以实现的功能真是太多了。源代码解析编译肯定是会用到的,比如判定一个变量定义,判定一个赋值语句等,这些内容都需要以regex为基础来实现。还有就是智能编辑器里面,要实现语法高亮,也就是保留关键字、常量、字符串、注释这些需要有不同的字体颜色,这个也是明显需要用到regex的。
特殊字符
首先就是\
——反斜杠(back-slash),这个是regex里面的转义符,后面跟其他特定的一些字符会产生匹配符,用来匹配特定的字符。
还有其他的特殊字符,叫做元字符(metacharacter),有
^ . [ ] $ { } * ( ) + | ? < >
这么多,这些在regex里面是本来就有特殊含义的。但是文本里面本来可能是有这些字符的,要匹配这些字符的话就需要在这些元字符前面加上转义符’\’。就像”+“是在文本里面查找’+’。
匹配规则不完全小总结
不是都总结的到,都是一些最最基本的东西。
匹配预定义的字符
一些regex已经预定义好的一些匹配字符规则:
item | notes |
---|---|
. | 小数点,匹配除换行符以外的任意字符,有点通配符的意思 |
\w | w代表word,匹配字母或者数字或者下划线或者汉字,其实就是一个word的基本组成啦 |
\s | s代表space,匹配空白符,就是空格、tab、换行符这些 |
\d | d代表digit,匹配数字 |
转义符’\’
有两个用途:
- 加在特定字符前产生匹配符;
- 加在元字符前用来匹配文本中的符号。
匹配自定义的字符集合
要匹配自己定义的字符集合的话要就是用”[]”中括号里面加上字符集合来实现,比如要匹配元音字母可以用”[aeiou]”这样来。
“[]”的特殊的地方是大多数元字符在里面是失效的,例外的情况是”\ : ^ -“这四个,’\’还是表示转义,’-‘表示范围。”[a-z0-9A-Z]”就是表示英文大小写和数字的集合。
反义
就是跟匹配规则相反的匹配,有两种情况:
- 大写:
- \W 跟\w相对,匹配非字母、数字、下划线和汉字;
- \S 跟\s相对,匹配非空白字符;
- \D 跟\d相对,匹配非数字字符。
- “[]”+”^”–>”[^…]”实现对集合”…”的反义。
匹配次数限定符
指的是对之前的匹配表达式的匹配次数的限定。
item | notes |
---|---|
{m,n} | 重复匹配m至n次,这里显然m<n,这是最基本的 |
{n} | 重复n次,相当于{n,n} |
{m,} | 重复至少m次,相当于{m,+∞} |
? | 重复0或1次,相当与{0,1} |
+ | 重复至少1次,相当于{1,+∞} |
* | 重复任意次,相当于{0,+∞} |
有了这么几条,其实就已经可以写出很多很多的regex字符串来,比如\d{3,4}-\d{8}
——前面3~4个数字,中间一个-
,后接8个数字,可以表示一个电话号码,比如028-66666666
,要精确一点0577-\d{8}
,可以匹配区号是0577
的号码。
位置匹配符
只匹配位置,不匹配字符的匹配符。
tiem | notes |
---|---|
\b | 匹配一个字符串的开始或结尾 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
再强调一下位置匹配符只匹配位置。\b
匹配字符串的分界,字符串里面的每个元素都是\w
,所以\b
可以定义为:一个两侧有一个不是\w
的位置。所以^
就是——右侧是\w
左侧不是的一个位置;$
反之。
于是一个字符串可以按这个精确的定义为:^\w+$
。
未完
regex是很复杂的,不同的环境对regex的支持不一样,还有很多高级的特性没有学习到。
而这里总结的这些是最基础的,使用频率很高,也是被广泛支持的。
饭要一口一口吃,先这样吧。