正则表达式在咱们平时的工做中至关的经常使用,不管是写jmeter脚本,或者写自动化脚本,均可能会用到正则表达式。这篇文章主要梳理正则表达式的经常使用知识点,并结合一些具体的例子,让你们能掌握使用正则表达式的正确姿式,以致于有打通“任督二脉”之效。html
正则表达式的功能归纳讲主要有四个:java
正则表达式的特色,归纳起来是:python
由于语句的精简,因此对于不少新手来讲,正则表达式会显得晦涩难懂。可是一旦你掌握它,将会大大提高你的工做效率,会让不少复杂的代码逻辑,变的精简。mysql
何为“引擎”?个人理解就是能驱动整个系统运转,好比汽车发动机引擎,主要部件是气缸,是整个汽车的动力源泉。一样正则表达式引擎就是能驱动实现正则表达式功能(匹配、替换、提取)的程序,目前主流的正则表达式
可能你们会以为比较难理解,毕竟比较偏理论。这里和你们解释下几个关键字:算法
有穷:表示有限的意思,表示有限次数内能获得结果。sql
自动机:其实起的名称而已,能够理解成引擎能根据规则自动匹配,不须要人为干预。编程
肯定型和非肯定型: 假设有一个字符串(text=abc)须要匹配,在没有编写正则表达式的前提下,就直接能够肯定字符匹配顺序的就是肯定型,不能肯定字符匹配顺序的则为非肯定型。windows
为了更直观的让你们理解NFA和DFA,从网上爬了两种动图(来自知乎—猪哥的Python)。(https://zhuanlan.zhihu.com/p/107836267)网络
DFA引擎执行原理动图以下所示:
NFA引擎执行原理动图以下所示:
正则表达式由普通字符和元字符组成,其中普通字符主要就是咱们常见的字母、数字、汉字、下划线以及没有特殊含义的标点符号等。下面我帮你们归类整理了常见的特殊字符(参考了菜鸟教程(https://www.runoob.com/regexp/regexp-tutorial.html)并增长了本身的理解)。
字符 | 描述 |
---|---|
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
\r | 匹配一个回车符 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等 |
\S | 匹配任何非空白字符 |
\f | 匹配一个换页符 |
\v | 匹配一个垂直制表符 |
字符 | 描述 |
---|---|
* 等价于 {0,} | 匹配前面的子表达式0次或屡次 |
+ 等价于 {1,} | 匹配前面的子表达式1次或屡次 |
? 等价于 {0,1} | 匹配前面的子表达式0次或1次 |
{n} | n是一个非负整数。匹配前面的子表达式n次 |
{n,m} | m和n均为非负整数,而且n<=m,匹配前面的子表达式至少n次最多m次 |
{n,} | n是一个非负整数,匹配前面的子表达式至少n次 |
限定符主要用于对匹配内容数量的限制,注意我在上面表格中列出了三组等价关系的写法。另外这里还牵扯到一个知识点,贪婪匹配和非贪婪匹配:
举个例子, 源字符串是aaabaaab,假如正则表达式是:.*b,则最终能匹配到:aaabaaab,这就是贪婪匹配。若是正则表达式加上?:.*?b,则最终能匹配到两个aaab,相对来说这就是非贪婪匹配。
字符 | 描述 |
---|---|
\d 等价于 [0-9] | 匹配数字0到9之间的数字 |
\D 等价于 [ ^0-9] | 匹配非数字0到9的字符 |
\w 等价于 [A-Za-z_0-9] | 匹配包括下划线的任何单词字符 |
\W 等价于 [ ^A-Za-z_0-9] | 匹配非下划线、单词字符 |
\s 等价于[ \f\n\r\t\v] | 匹配任何的非打印字符 |
\S 等价于[ ^\f\n\r\t\v] | 匹配任何的打印字符 |
. | 匹配除了\n以外的任意单个字符 |
须要注意在上面表格中分别列出了等价写法,主要是为了方便你们的理解和记忆。
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置 |
$ | 匹配输入字符串结尾的位置 |
\b | 匹配一个单词边界,即字与空格间的位置 |
\B | 非单词边界匹配 |
^和$应该比较好理解,\b和\B表示的是单词的边界,咱们后面会经过具体的例子来帮助你们理解它的含义。
字符 | 描述 |
---|---|
(pattern) | 匹配pattern并获取这一匹配。所获取的匹配能够从产生的Matches集合获得 (结果会被存储起来),须要注意的是,若是要匹配括号,须要使用转义字符'(' 或 ')'。 |
\number | 反向引用,能够在正则表达式中利用数字下标number引用()分组的Matchers集合的内容,好比: 源字符串是abcdebbcde,正则表达式是:([ab])\1,最终会匹配到bb。 |
a|b | 匹配字符串a或者b,是“或”的关系 |
(?:pattern) | 匹配pattern,可是并不获取匹配结果(和上面的(pattern有区别))。也就是说不将匹配结果 存储起来,供后面能够获取使用。好比:源字符串是:industry|indestries,正则表达式是industr(?:y|ies),最终能匹配到industry和indestries。 |
(?=pattern) | 正向确定预查,在任何匹配pattern的字符串开始处匹配查找字符串, 可是不获取匹配结果,且不消耗字符串。好比:源字符串是:Windows2000,正则表达式是Windows(?=95|98|NT|2000),最终能匹配的是:windows。若是源字符串是:Windows3.1,则不能匹配。 |
(?!pattern) | 正向否认预查,在任何不匹配pattern的字符串开始处匹配查找字符串, 可是不获取匹配结果,且不消耗字符串。这个正好和(?!pattern)是相反的。好比:源字符串是:Windows3.1,正则表达式仍是:Windows(?=95|98|NT|2000),则最终能匹配到字符串:Windows。 |
(?<=pattern) | 逆向确定预查,与正向确定预查相似,只是方向相反。好比:源字符串是:2000Windows,正则表达式是:(?<=95|98|NT|2000)Windows,能匹配到字符串Windows。一样的若是源字符串是3.1Windows,则不能匹配。 |
(?<!pattern) | 逆向否认预查,与正向否认预查相似,只是方向相反。好比:源字符串是:3.1Windows,正则表达式是:(?<=95|98|NT|2000)Windows,一样的若是源字符串是2000Windows,就没法匹配。 |
正则表达式从左到右进行计算,并遵循优先级顺序,这跟你们常见的算术表达式很是相似。相同优先级的从左到右进行运算,不一样优先级的运算先高后低。下表中的优先级是从高到低排列。
字符 | 描述 |
---|---|
\ | 转义字符 |
(), (?😃, (?=), [] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
| | 或操做 |
文中主要梳理了正则表达式的基础知识点,我的以为你们彻底不必记忆,只须要在使用的时候能知道用什么便可。而后再来翻阅这篇文章中帮你们总结的知识点。