正则表达式使用笔记

字数 943阅读 266

由于最近接手一个代码使用正则表达式匹配location做不同环境的配置,由是又双叒叕看不懂正则,第N次去看正则相关的材料,所以觉得还是应该知其所以然,系统学习一下,并做下总结。

图书材料 :《学习正则表达式》

What

正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串。
—— Ken Thompson

Regular Expression的“Regular”一般被译为“正则”、“正规”、“常规”。此处的“Regular”即是“规则”、“规律”的意思,Regular Expression即“描述某种规则的表达式”之意。 —— 维基百科

这个网站很方便做正则的测试:http://www.regexpal.com/

How

下面讲解一下常用的正则语法
正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。

原义示例: 正则表达式:hello,对hello world的匹配结果为 hello world

元字符使正则表达式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

简单点:元字符不参与匹配,其表示的特殊意义作为规则匹配

元字符

元字符 作用 示例 匹配结果(用超链接样式做为匹配标志)
. 匹配任意字符 . aBc.:x
\ 转义符下一个字符标记为
一个特殊字符
或一个原义字符
或一个后向引用
或一个八进制
\.
其余后面分别详细讲解
aBc.:x匹配真正的.
| 或操作 [3|5] 12345
^ 行起启锚位符
非,不匹配指定字符或字符组
^1
[^12]
1211
31245
$ 行结束锚位符 1$ 1211
? {0,1}匹配前面字符 0次或1次 21? 2
21
(无论是否有1都会被匹配)
* {0,n} 0次或多次 21* 2
21
211111
+ {1,n} 1次或多次 21+ 2(没有1时不会被匹配)
21
211111
{} 量词或代码块 a{3}
a{2,5}
aaabaa (3个a,2个不会被匹配)
aaabaa (2到5个a会被匹配)
[] 字符组(字符集:一类字符的集合) [abc]
字符范围[a-z]
dabec
a-z任意小写字母
同理有:[A-Z],[0-9],[a-zA-Z]
() 分组,子表达式,优先 ([ab])x\1 axa
bxb
axb
\1指代前面的[ab]这个子表达式的匹配值
- 分隔线 - -
以下一些由\开头的特殊意义字符 注意有时需要"\\"来转义为\与后面的字符配合成新的意义使用
\b 单词边界,表示单词的起始 \baaa\b
\baaa
baaa aaa aaab
baaa aaa aaab
\B 非单词边界 \Baaa\B baaa aaa baaab aaab
\d 数字 \d 124SA236SFa
\D 非数字 \D 124S<:">A236SFa
\s 匹配任何空白字符,包括空格、制表符、换页符等等。 \s 等价于[ \f\n\r\t\v] (后续介绍)
\S 匹配任何非空白字符 \S 等价于[^\f\n\r\t\v]
\w 匹配包括下划线的任何单词字符。 等价于[A-Za-z0-9_]
\W 匹配任何非单词字符。 等价于[^A-Za-z0-9_]
tip 大小写表示的含义相反
\f 匹配一个换页符 等价于\x0c和\cL
\n 匹配一个换行符 等价于\x0a和\cJ
\r 匹配一个回车符 等价于\x0d和\cM
\t 匹配一个制表符 等价于\x09和\cI
\v 匹配一个垂直制表符 等价于\x0b和\cK
tip 多用于支持正则查找替换的编辑器
\xn 匹配n,其中n为字符的十六进制值。十六进制转义值必须为确定的两个数字长。 \x41
\x401
A
等价于\x04&1正则表达式中可以使用ASCII编码。
\num 标识一个八进制转义值或一个向后引用。
如果\n之前至少n个获取的子表达式,则n为向后引用[1]
否则,如果n为八进制数字(0-7),表示字符的进制值。[2]
(.)\1

\101
匹配两个连续的相同字符aa bb ccda
A
\uxxxx 字符的Unicode值 \u00A9 © 版权符号
优先级 符号
最高 \
( )、(?: )、(?= )、[ ]
*、+、?、{n}、{n,}、{m,n}
^、$、经\转义的
最低 |

其它

  • 贪婪型,懒惰型元字符
    * 和+,{n,} 贪婪型元字符,它们在进行匹配时的行为模式是多多益善而不是适可而止的。
    *?,+?,{n,}? 懒惰型元字符(上面的加?后缀) 适可而止
    例:字符串 123456
    3\d+匹配结果:123456 3及其以后的数字全被匹配,多多益善
    3\d+?匹配结果:123456 3及其后的一个数字被匹配,适可而止

  • 前后查找 有时候需要正则表达式标记要匹配的文本的位置(而不仅仅是文本本身)

  1. (?=) 正向前查找 其实就是一个以?=开头的子表达式
  • (?<=)正向后查找 查找出现在匹配文本之后的字符(js不支持)
  • (?!) 负向前查找 指的是不与给定模式相匹配的文本 不常用
  • (?<!)负向后查找 同上
    例:.{2}(?=(abc)) 结果 xxxabc (abc前面的两个字符)
    (?<=al).*(?=xl) 结果alcccxl (al与xl中间的字符 )

实例

掌握上面的这些基础理论,应该就可以应付正则的大部分使用场景,能看能写。

运行效果。好累,感觉再也不会写这种傻逼彩蛋了
快速去掉双引号

小结

正则的语法还是比较简单易懂的,只是用的频率不是那么高,所以容易忘,所以做下笔记,以后忘了看自己写的东西终归是更容易理解,也希望对大家有帮助。


  1. 向后引用(back-reference)一个子字符串(substring),该子字符串与正则表达式的第num个用括号围起来的子表达式(subexpression)匹配。其中num是从1开始的正整数,其上限可能是99

  2. 此处八进制的值为0-277对应ASCII码的八进制值

推荐阅读更多精彩内容