0.问题引入
字符串是计算机应用中最为广泛的处理对象之一(浏览器,xml文件,代码===)
并且字符串的组合规则形式各种各样,如:
数字字符串
email字符串
IP地址字符串
网址
......
这些都是我们程序设计需要去处理的对象,现在的问题是:
计算机要处理这些字符串,首先要用某种语言(表达式,数据类型)
去描述这些字符串的规则
===> 世界标准
正则表达式
1.正则表达式
它究竟是个啥玩意?
正则表达式是用来描述某种规则字符串的表达式
脱离了具体语言的一些规则,但是现在大多数的程序设计语言都实现了
C/C++
python
C#
....
但是每种语言中实现正则表达式的规则略有不同
2.正则表达式的规则
正则表达式是描述某种规则字符的表达式。
如:
十进制数字字符串
[0-9]+
表达的含义: 有一个或者多个0-9的字符组合而成的字符串。
正则表达式也叫做匹配模式,它是由一组特定含义的字符串组成,
通常用于匹配和替换文本
在正则表达式中的字符,分为两种:
(1)普通字符 :只代表自己本身含义的字符
(2)元字符 : 有特定的含义(不代表自己)的字符
正则表达式中的元字符:
. 匹配任意单个字符
如果你想要表达'.'的含义
需要转义 \.
[] 字符组
虽然由多个字符构成,但是它仍然只匹配单个字符。
字符组能够匹配的单个字符,都在[]内列举出来。
[]仅匹配括号里面的一个字符
例子:
[0123456789abcdefABCDEF]
表达的含义:匹配一个 十六进制的字符
[] 字符组里面也有一个元字符 : -
- : 在[]内用于连接ASCII连续的字符
练习:
写一个正则表达式,用于表达一个十六进制字符
[0-9a-fA-F]
练习:写一个正则表达式,用来描述一个可以作为C语言中描述符的字符
数字,字母,_
[0-9a-zA-Z_]
[^] 排除字符组
匹配单个字符,匹配除[]内,外面的所有的字符中的单个字符
如:
非十进制数字字符
[^0-9]
\d: digtial
匹配单个十进制数字字符
\d <==> [0-9]
\D: Digtial
匹配单个非十进制数字字符
\D <==> [^0-9]
\w: word
匹配单个单词中能够出现的字符
字母,_,数字
\w <==>[a-zA-Z_0-9]
\W:
匹配单个非字母,数字,_
\w <==>[^a-zA-Z_0-9]
\s: 匹配单个空白符
\s <==>[\f\n\r\t\v]
\f --> 换页符
\n --> 换行符
\r --> 回车符
\t --> 制表符
\v --> 垂直制表符
\S: 匹配单个非空白符
\S <==>[^\f\n\r\t\v]
例子:
[a-z^0-9]
表达的含义:
匹配单个 a-z,^,0-9
如果^是排除的话,‘^’放在最前面。
匹配多个字符:
+ 匹配一个或多个先前字符(或模式)
如:
09+
=>
09
099
0999
09999
......
[0-9]+
=>
[0-9]
[0-9][0-9]
[0-9][0-9][0-9]
.......
* 匹配0个或多个先前的字符(或模式)
如:
09*
=>0
09
099
0999
.....
[0-9]*
=>
"" -> 空串
[0-9]
[0-9][0-9]
[0-9][0-9][0-9]
? 匹配0个或1个先前的字符(或模式)
如:
09?
=>0
09
[0-9]?
=> ""
[0-9]
{数字} 匹配固定数目的字符(或模式)
如:
88[0-9]{3}
=>
88[0-9][0-9][0-9]
{最小数目,最大数目}
匹配至少“最小数目”,至多到“最大数目”的先前字符(或模式)
如:
8{1,3}
=> 8
88
888
{最小数目,}
匹配至少“最小数目”,上不封顶的先前字符(或模式)
如:
abc{1,} <==> abc+
=>
abc
abcc
abccc
......
() 作为一个整体,子模式
如:
(abc){1,3}
==>
abc
abcabc
abcabcabc
(|) 二选一
如:
(123|abc){2}
==> 123123
123abc
abc123
abcabc
转义元字符:
\元字符 => 元字符就不是元字符了,就变成了普通字符
如:
\. 代表一个普通字符‘.’
\* 代表一个普通字符‘*’
....
练习:
1.用正则表达式描述你C语言代码中出现的十进制数字字符串
[0-9]+
2.请用正则表达式描述一个十六进制数字 < 2^32 的十六进制数字字符串。
0x / 0X
0x0
0x00
0x1....
....
...
0xffffffff
0[xX][0-9a-fA-F]{1,8}