基础知识篇

 

一、 七个元字符

限定符 描述 模式
.

匹配出换行符以外的任意字符

\d*\.\d

\w

匹配字母数字或下划线或者汉字或者下划线

"be+"
\s

匹配任意空白符

  
"rai?n"
\d

匹配数字

",\d{3}"
\b

匹配单词开始或结束,它只是匹配一个位置

"\d{2,}"

^

匹配字符串开始

"\d{3,5}"

$

匹配字符串结束

"\d{3,5}"
 
占有字符与0宽度:当字符串中的某一个或某一些被匹配到,丢到结果集中后,那这些字符就是占有字符;当表达式匹配到的只是个位置的话,那么这个位置就叫0宽度。
转义字符 \:如果想得到元字符本身的话,那么可以用 “\” 来取消元字符的作用,得到其本身,例如:\$,\\s
 
二、字符类[ ]
    用符号“[]”将字符括起来,例如[a,b,c]表示匹配a或者b或者c
 
三、重复或者叫限定符

代码/语法

说明

*

重复0次或多次

+

重复一次或多次

?

重复零次或1次

{n}

重复n次

{n,}

重复至少n次

{n,m}

重复至少n次,但不多于m次

 
四、分支条件 |
    指的是将不同的正则表达式规则分开,正则表达式是从左往右依次匹配,如果满足了某个分支就不会再管其他分支了。特殊的,如 字符类 [abc] = a|b|c
 
 
五、分组 ( )
    (\d{1-2}){3} 意思就是匹配4-6位数字,如4586983那么匹配的结果是:458698
    
六、反义字符

代码/语法

说明

\W

匹配任意一个不是字母或数字下划线或汉字的字符

\S

匹配任意一个不是空白符的字符

\D

匹配不是数字的字符

\B

匹配不是单词开头或者结尾的位置

[^X]

匹配除了X以外的任意字符

[^aeiou]

匹配除了aeiou这几个字母以外的任意字符

 
七、反向引用    
    使用小括号来指定表达式后,匹配到这个子表达式的文本(也就是字表达式捕获的内容)可以在表达式或者其他引用程序中继续使用,默认情况下,每个分组会有一个编号。从左往右,0对应的整个正则表达式,第一个子表达式为1,以此类推。
 
举例:
正则表达式:(?<work>3)(1)(2)(?<SmallDing>565)
匹配文本:312565
结果:
                   

分类

代表/语法

说明

 

 

捕获

 

 

(exp)

匹配exp,并捕获文本到自动命名的组里

(?<name>exp)

匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp)

(?:exp)

匹配exp,不捕获匹配文本,也不给分组分配组号

 

 

 断言

 

 

 

(?=exp)

匹配exp前面位置,但是不匹配exp

(?<=exp)

匹配exp后面位置,但是不匹配exp

(?!exp)

匹配后面的不是exp的位置,但是不匹配exp

(?<!exp)

匹配前面不是exp的位置,但是不匹配exp

注释

(?#comment)

注释

 
八、断言
    1. 零宽度断言 
            ⑴  (?=exp) :零宽度正预测先行断言,总结:匹配 exp 前面的东西
                    举例:\b\w+(?=ing\b)  匹配以 ing 结尾,但不包含 ing 的单词。
            ⑵  (?<=exp):零宽度正回归断言,总结:匹配 exp 后面的东西
                    举例:(?<=Doing)\d{3} ;文本:Doing456;结果:456
     2.负向零宽度断言
            ⑴ (?!exp):零宽度负预测先行断言,断言此位置后面跟的不能是匹配的exp
                    举例:\d{3}(?!123):前面匹配的是三位数字,后是匹配位置,后面匹配的后面跟的不能是123
            ⑵ (?<!exp):零宽度负回顾断言,断言此位置前面不能是匹配的exp
 
九、平衡组
 
    最常见的应用是匹配Html标签:

语法

说明

(?’group’)

把捕获的内容命名为group,并压入堆栈

(?’-group’)

从堆栈上弹出最后压入堆栈名为group的捕获内容,如果堆栈为空则本组匹配失败

(?(group)yes|no)

如果堆栈上存在名为group的捕获内容的话,继续匹配yes部分的表达式,否则匹配no的表达式

(?!)

零宽度负先行断言,由于没有后缀表达式,试图匹配总是失败

 
        分组存入到各个组别,其实每个组别都是一个堆栈的数据结构,允许压入,也允许弹出。对于字符串:123456 ,正则表达式:(?'Group'123)(?'Group'456)匹配结果如图:
                                            
                                              
再使用正则表达式:(?'Group'123)(?'Group'456)(?’-Group’),后数据结果如图:                                    
                                            
 
十、贪婪与非贪婪字符
    贪婪字符就是限定符中去掉 符号 “.”,如下表:
限定符 描述 模式 匹配
* 匹配上一个元素零次或多次 \d*\.\d ".0","19.9"和"219.9"
+ 匹配上一个元素一次或多次 "be+" "been"和"bee","bent"和"be"
匹配前面的元素零次或一次   "rai?n" "ran"和"rain"
{n} 匹配上一个元素恰好n次 ",\d{3}" "1.043.6"中的.043
{n,} 匹配上一个元素至少n次 "\d{2,}" "166","29"和"1930"
{n,m} 匹配上一个元素至少n次,但不多于m次 "\d{3,5}" "166","16546","132654"中的13265

    非贪婪字符就是贪婪字符后面加“?”号,如下表:

限定符 描述 模式 匹配
*? 匹配上一个元素零次或多次,但次数尽可能少 \d*?\.\d ".0","19.9"和"219.9"
+? 匹配上一个元素一次或多次,但次数尽可能少 "be+?" "been中的"be",bent"中的"be"
?? 匹配上一个元素零次或一次,但次数尽可能少 "rai??n" "ran"和"rain"
{n}? 匹配前导元素恰好 n 次 ",\d{3}?" "1.043.6"中的.043
{n,}? 匹配上一个元素至少 n 次,但次数尽可能少 "\d{2,}?" "166","29"和"1930"
{n,m}? 匹配上一个元素的次数介于 n 和 m 之间,但次数尽可能少 "\d{3,5}?" "166","16546","132654"中的"132","654"


十、优先级顺序
运算符描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,"或"操作
字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

十一、需要转义的特殊字符小结


误区:
1. 匹配文本:  Doing123  的正则 是  (?<=Doing)Doing\d{3}  而不是 (?<=Doing)\d{3}
 
.NET 环境下的替换:

替换

说明

$number

包括替换字符串中的由 number 标识的捕获组所匹配的最后一个子字符串,其中 number 是一个十进制值。

${ name }

包括替换字符串中由 (?<name> ) 指定的命名组所匹配的最后一个子字符串。

$$

包括替换字符串中的单个“$”文本。

$&

包括替换字符串中整个匹配项的副本。

$`

包括替换字符串中的匹配项前的输入字符串的所有文本。

$'

包括替换字符串中的匹配项后的输入字符串的所有文本。

$+

包括在替换字符串中捕获的最后一个组。

$_

包括替换字符串中的整个输入字符串。

 
 1. $number
    需求:匹配一串数字千分位变为“,”,例如:123456789 替换后的结果为:123,456,789
    分析:需要找到位置“3”,“6”;完后将这些数字替换为相应的“number,”,找的这个数字后面跟着的是一个或者多个三位数字
    表达式:(\d)(?=(\d{3})+(?!\d))
    替换内容:$0,
 
2. ${name}
    需求:同上
    分析:给第一个组分配一个组号 test
    表达式:(?'test'\d)(?=(\d{3})+(?!\d))
    替换内容:${test},
 
3. $$ 在匹配的内容插入一个 “$” 字符,将浮点数字转化为金额,例如将:15.23,33.12,44.31 替换为 $15.23,$33.12,$44.31
    分析:
    表达式:([0-9.]+)
    替换内容:$$$1   有背景的部分参考1
 
4. $& 取得是第0组内容,还是上面的例子
    分析:
    表达式:([0-9.]+)
    替换内容:$&$1
    结果:15.2315.23   33.1333.12  44.3144.31
 
5. $` $' 前一个是包含替换部分前面的内容,后一个反之,例如aa1bb2cc3
    表达式:(\d)
    替换内容:$`
    结果:aaaabbbbccc
 
    
 
 
 
 
 
posted @ 2019-05-02 19:33  NCat  阅读(149)  评论(0)    收藏  举报