正则表达式的概念
regular expression, regex, RE
正则表达式是用来简洁表达一组字符串的表达式
假设我们有一组字符串
一种表示形式就是把它们一一列举出来
'PN'
'PYN'
'PYTN'
'PYTHN'
'PYTHON'
但是这种表示形式既繁琐又占用空间,有没有更简单的表达方式呢?
正则表达式就是为这个作用二单身的
针对刚才这个例子,正则表达式就一行
P(Y|YT|YTH|YTHO)?N
那么为什么使用正则表达式呢?正则表达式可以非常简洁地表达很大一组字符串的特征
一行胜千言 一行就是特征(模式)
例:
'PY'
'PYY'
'PYYY'
'PYYYY'
……
'PYYYY……'
一组字符串(无穷个)
正则表达式:
PY+
无穷字符串组的简洁表达
在表达无穷字符串组的时候,正则表达式非常有用
'PY'开头
后续存在不多于10个字符
后续字符不能是'P'或'Y'
'PYABC' √
'PYKXYZ' X
一组具有某些特点的字符串
(可以枚举,但很繁琐)
正则表达式:
PY[^PY]{0,10}
正则表达式是用来简洁表达一组字符串的表达式
正则表达式是一种通用的字符串表达框架
正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具
正则表达式可以用来判断某字符串的特征归属
正则表达式在文本处理中十分常用:
表达文本类型的特征(病毒、入侵等)
同时查找或替换一组字符串
匹配字符串的全部或部分
……
最主要应用在字符串匹配中
为了使用正则表达式,我们需要对正则表达式进行编译的过程
所谓编译,是指将符合正则表达式语法的字符串转换成正则表达式特征
我们可以说正则表达式是一个语法格式,但是在程序中,我们必须用字符串的形式来表达它,但是字符串就是字符串,但不是一组字符串,所以我们需要通过编译,将一个字符串变为一个语法特征,用这个语法特征来表达一组字符串
我们也可以认为编译后的特征与一组字符串是对应的,而编译之前的正则表达式只是符合正则表达式语法的一个单一字符串,但它并不是真正意义上的正则表达式
正则表达式的语法
P ( Y | Y T | Y T H | Y T H O ) ? N
正则表达式语法由字符和操作符构成
正则表达式的常用操作符
操作符 | 说明 | 实例 |
. | 表示任何单个字符 |
|
[ ] | 字符集,对单个字符给出取值范围 | [abc]表示a、b、c,[a‐z]表示a到z单个字符 |
[^ ] | 非字符集,对单个字符给出排除范围 | [^abc]表示非a或b或c的单个字符 |
* | 前一个字符0次或无限次扩展 | abc* 表示 ab、abc、abcc、abccc等 |
+ | 前一个字符1次或无限次扩展 | abc+ 表示 abc、abcc、abccc等 |
? | 前一个字符0次或1次扩展 | abc? 表示 ab、abc |
| | 左右表达式任意一个 | abc|def 表示 abc、def |
{m} | 扩展前一个字符m次 | ab{2}c表示abbc |
{m,n} | 扩展前一个字符m至n次(含n) | ab{1,2}c表示abc、abbc |
^ | 匹配字符串开头 | ^abc表示abc且在一个字符串的开头 |
$ | 匹配字符串结尾 | abc$表示abc且在一个字符串的结尾 |
( ) | 分组标记,内部只能使用 | 操作符 | (abc)表示abc,(abc|def)表示abc、def |
\d | 数字,等价于[0‐9] |
|
\w | 单词字符,等价于[A‐Za‐z0‐9_] |
|
例如
正则表达式 | 对应字符串 |
P(Y|YT|YTH|YTHO)?N | 'PN'、'PYN'、'PYTN'、'PYTHN'、'PYTHON' |
PYTHON+ | 'PYTHON'、'PYTHONN'、'PYTHONNN' … |
PY[TH]ON | 'PYTON'、'PYHON' |
PY[^TH]?ON | 'PYON'、'PYaON'、'PYbON'、'PYcON'… |
PY{:3}N | 'PN'、'PYN'、'PYYN'、'PYYYN'… |
经典正则表达式实例
^[A‐Za‐z]+$ | 由26个字母组成的字符串 |
^[A‐Za‐z0‐9]+$ | 由26个字母和数字组成的字符串 |
^‐?\d+$ | 整数形式的字符串 |
^[0‐9]*[1‐9][0‐9]*$ | 正整数形式的字符串 |
[1‐9]\d{5} | 中国境内邮政编码,6位 |
[\u4e00‐\u9fa5] | 匹配中文字符 |
\d{3}‐\d{8}|\d{4}‐\d{7} | 国内电话号码,010‐68913536 |
匹配IP地址的正则表达式
IP地址字符串形式的正则表达式(IP地址分4段,每段0‐255)
\d+.\d+.\d+.\d+ 或 \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}
精确写法 0‐99: [1‐9]?\d
100‐199: 1\d{2}
200‐249: 2[0‐4]\d
250‐255: 25[0‐5]
(([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]).){3}([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5])