正则匹配实际上可以看做是一种属性匹配,一个字符串中,他的每个字符可以看做是一个实体,字符中间的缝隙也可以看做是实体,他们的属性包括内在属性和关联属性(该属性取决于字符的外部环境),每个属性标记代表的是一个属性集合,小的集合构成大的集合从而形成整体属性。
三个基本操作
1.regex_match判断目标字串是否匹配指定的正则表达式
2.regex_search在目标字串中寻找匹配指定正则式的字串
3.regex_replace 在目标字串中寻找匹配指定正则式的字串,之后用预设的字串替换这些匹配的字串
每次匹配应该包含三个主要元素,1)目标字串 2)正则式 3)匹配结果
属性标记分两类:
1)字符属性标记
- 内在属性表示字符本身的含义,例如d . v s cletter[class] [^class]
- 关联属性,例如w(一个单词) 、重复次数* + ? {int,int} ,对于"aaa",我们可以用“a{3}”,这三个a本来都是独立的个体,但是他们放在一起就又具有了关联属性(就是重复三次),对第一个a而言,他的右边也是一个a,同时他右边这个a的右边也是一个a,因此第一个a可以匹配 a{3},同样第二三个a也匹配该属性。
2)位置属性标记
- 他的内在属性很简单,就是一个位置
- 一个位置根据所处的外部环境不同就形成了多样的关联属性 ^ $ ?= ?<,位置不会有重复次数这种关联属性
--------------------------------------------------------------------------------------------------------------------------
对于匹配结果有下面几个结果提取符号可用
$n 代指第n个分组的子串
$& 代指当前匹配到子串
$$ 代指符号本身
需要转义的字符
- $ ---> $
- ( ---> (
- ) ---> )
- * ---> *
- + ---> +
- . ---> .
- [ ---> [
- ] ---> ]
- ? ---> ?
- ---> \
- / ---> /
- ^ ---> ^
- { ---> {
- } ---> }
还有一种平衡组的用法, 主要使用下面几个功能
(?'group'exp) 将exp压入堆栈
(?'-group'exp) 将exp弹出堆栈
(?(group)yes|no)检查堆栈中是否含有exp 然后继续匹配yes 或no分支
(?!)回顾断言,不能匹配任何东西,可以作为yes 或no条件