写代码的运维妞

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

http://regexr.com/

是一个提供在线版的正则式编辑、学习、创建和测试的平台,帮助编程人员快速的编写正则表达式,内置多种转义字符,点击即可添加,同时还拥有在线保存和分享的功能。

 

一、正则表达式 - 入门篇

1.元字符
.  匹配除结束符以外的任意字符,某些情况下不能匹配行起始符

^    匹配行的开始, 例如 ^The 匹配以The打头的行

$    匹配行的结束,例如 home$匹配以home结尾的行,^$匹配空行

?  匹配0或1个任意字符

*  匹配0到任意多个任意字符

+  匹配1到任意多个任意字符

{   量词起始符

}   量词结束符

[    字符组的起始符

]    字符组的结束符

\    转义字符

(  捕获分组的起始符

)  捕获分组的结束符

|  用或(or)的方法进行匹配

 

2. 常用例子

[]  字符组

()  用于捕获分组

{}  表示带查找的字符要重复的次数

{n,}  代表前面的字符可以重复n到无穷多次

{n1,n2}  代表前面的字符可以重复n1到n2次

[0-9]  字符组,匹配数字0-9

[^0-9]  字符组,对[0-9]取反,匹配非数字0-9的任意字符

[\+\-\*\-]  字符组,代表加减乘除号

 

 

\d  数字字符,匹配任意阿拉伯数字,等同于[0-9]

\D  非数字字符,匹配任何一个非数字字符,即\d 取反

\w  小写的\w  单词字符,匹配字母、数字、下划线,即[_a-zA-Z0-9]

\W  大写的\W 非单词字符,匹配非单词字符,即对小写\w取反,即[^_a-zA-Z0-9]

\a  警告声音输出

\b  退格符

\c x 控制符

\f  换页符

\t  垂直的制表符

\v  小写\v 水平的制表符

\V  大写\V  非水平制表符

\h  水平空白符

\H  非水平空白符

\r  回车符

\n  换行符

\0  空字符

\s  小写\s  匹配空白符,即,能匹配空格、制表符\t、换行符\n、回车符\r

\S  大写\S  匹配非空白符,即小写\s取反

\0 XXX  字符的八进制值

\x xx   字符的十六进制值

\u xxx  字符的Unicode值

(?i)    匹配模式时不区分大小写

 (?i)the  匹配THE the The 等

 

2. 举例:捕获分组

将模式放入一对圆括号中,就是将它放进了分组,例如,(\d)\d

 

3. 举例:非捕获分组

 非捕获分组(Non-capturing Group),不会将内容存储在内存中,因此该分组无法被引用,但也因此性能更好

 

4. 举例:后向引用

捕获分组后,后面可以用\1对捕获的内容进行后向引用,例如,(\d)\d\1,该模式可以匹配数字字符707,101,212, 505, 等等

例子: (?:the|THE|The)

 

5. 例子若干,自行体会,加强理解

\d+\.?\d* 匹配形如正整数、正小数的字符
\-?\d+\.?\d* 匹配形如正整数、负整数、正小数、负小数的字符
[^\d\+\-\*\/\(\)\.] 匹配这些字符以外的字符:数字字符、加减乘除号、正反括号、小数点
[\+\-\*\/\.]{2,} 匹配连续的加减乘除号、小数点
[^\(\)]*\([^\(\)]+\)[^\(\)]* 匹配配对的括号
\(([\+\-\*\/]*\d+\.?\d*)+\) 匹配最内层括号
(.*)(\d+\.?\d*)([\*\/])(\d+\.?\d*)(.*) 匹配乘除法表达式
(\-?\d+\.?\d*)([\+\-])(\-?\d+\.?\d*)(.*) 匹配加减法表达式

 

二、正则表达式 - 进阶篇

1.使用正在表达式为纯文本标签HTML5标签

例如,sed -n 's/^/<h1>/;s/$/</h1>/p;q' rime.txt

rime.txt中的文字将以h1格式(即所有字母大写)输出

 

2. 边界

断言,又称零宽度断言(zero-width assertion),用于标记边界,但不耗用边界上的字符,即字符不会返回到匹配结果中。零宽度断言不匹配字符,而是匹配字符串中的位置。例如^ $,也叫作锚位符(anchor)

^  匹配行的开始

$  匹配行的结束

\b  匹配单词边界,表面上会匹配空格或起始行,实际匹配的是零宽度的不存在的东西

\B  匹配非单词边界,即\b 取反,例如,\Be\B 不会匹配字母e两边的字符,但会识别e两边是否是非单词边界(即,用于标记边界,但不会将边界返回到匹配结果中)

可以用\Q和\E之间的字符集,匹配字符串的字面值。例如\Q$\E,会匹配$,而非行结束符,因为\Q和\E之间的任意字符都会被解释为普通字符。

 

3. 量词匹配的三种模式:贪心、懒惰、占有

a. 贪心模式:基本量词默认是贪心模式,如?,+,*,{m,n}

首先匹配整个字符串,选定尽可能多的内容,如果匹配失败,就回退一个字符后再次尝试,这个过程叫做回溯(backtracking)。贪心模式,在匹配时每次回退一个,直到找到匹配的内容或没有字符可尝试为止,较另两种模式而言,贪心模式对资源消耗最大。先“吃”尽所有,然后每次“吐”出一点,慢慢咀嚼消化

b. 懒惰模式: 在普通量词后添加?  量词就成为了懒惰模式 

从目标的起始为止开始尝试匹配,每次检查字符串的一个字符,最后才尝试匹配整个字符串。每次只“吃”一点

例子:对于字符串  55678

5? 匹配2个5, 5?? 只匹配到第1个5,前者是贪心模式,后者是懒惰模式

c. 占有模式:在普通量词后添加+  量词就成为了占有模式

覆盖整个目标后再尝试寻找匹配内容,但只尝试一次,不会回溯,因此速度快。不“咀嚼”而是直接“吞咽”,然后才想知道“吃”的是什么

例子:对于字符串 0000000

0.*+  匹配到所有的0   .*+0  什么也没匹配到, 前者是占有模式(看起来跟贪心模式一样,但没有回溯,运行更快),后者也是占有模式,因为没有回溯,一下就选定了所有输入,不再回过来查看

 

4. 环视:正前瞻、反前瞻、正后顾、反后顾

a. 正前瞻:

假设要匹配at,且要求紧随其后的单词是home,要到达这个目的,可以用正前瞻,格式如下:

at(?=home)   注意只有模式的第一部分at被标亮了,环视部分(home)不会被标亮  

b. 反前瞻:是对正前瞻取反,把=改成! 即 at(?!home)

c. 正后顾:查看左边的内容,与正前瞻方向相反,其语法是(?<=at) home,后顾部分(home)会被标亮,条件(at)不会被标亮

d. 反后顾: 对正后顾取反,查看某个模式在从左至右的文本流的后面没有出现,其语法是(?<!at) home,匹配到的结果里没有at

c、d在javascript中不支持

 

posted on 2016-11-04 18:39  kayegao  阅读(937)  评论(0编辑  收藏  举报