正则表达式30分钟入门教程
参考以上教程,本人在学习的过程中做了一些总结如下
一,知识框架
1. 首先,需要重点理解元字符,限定符,分枝条件,分组,反义
2. 其次,深入了解后向引用,零宽断言,负向零宽断言。
二,知识要点
1.元字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
2.限定符
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
3.分枝条件: |
a) 0\d{2}-\d{8}|0\d{3}-\d{7} :
这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
b) \(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8} :
这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。
c) \d{5}-\d{4}|\d{5} :
这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
4.分组:用小括号来指定子表达式(也叫做分组)
a) (\d{1,3}\.){3}\d{1,3}
这是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。
5.反义:
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字 |
a) \S+ : 匹配不包含空白符的字符串。
b) <a[^>]+> : 匹配用尖括号括起来的以a开头的字符串(这个例子宜重点留意)
三: 综合案例
之所以静下心来研究正则表达式,是因为遇到了一个用程序解一元一次方程的需求,在编码的过程中,有一个问题是如何检查一个多项式是否符合ax+b 或 b+ax的形式,于是想到了用正则表达式来解决,记录如下: