正则表达式简述
1.正则表达式介绍
正则表达式就是一个字符串 按照一种规则定义的,其目的是为了在另外的字符串中查找、替换、... 、符合指定模式的子字符串 或段落。如果没有配合正则函数使用,那么它就是一个普通字符串,毫无意义。
2.正则表达式的语法
正则语法中包含
1.原子(打印或非打印字符 如a-z 或 \r\n) 、
2.元字符(修饰原子的特殊字符)
3.模式修正符(增强表达式语句的)
语法:/原子和元字符/模式修正符
2.1 原子介绍
原子是正则语句的基本组成部分,是真正起到匹配作用的单元。所以一个正则语句中至少要包含这个基本单元。原子可以是任意的打印和非打印字符(打印字符如 字母 数字 标点... 非打印字符如 \f\r\n),对于特殊字符要配合‘\’转义,使特殊字符去掉其特殊意义 只保留字面意思。
1.那些需要进行转义
特殊字符 . * + ( ) $ / \ ? [ ] ^ { }
2.一些表示范围的元子
"\d" 表示任意一个十进制数字 同 [0-9]
"\D" 表示任意一个非十进制数字字符 同 [^0-9]
"\s" 表示任意一个空白 同 [\n\r\t\f]
"\S" 表示任意一个非空白 同 [^\n\r\t\f]
"\w" 表示任意一个字 (数字 字母 下划线) 同 [0-9a-zA-Z_]
"\W" 表示任意一个非字 非(数字 字母 下划线) 同 [^0-9a-zA-Z_]
自定义 表示中括号里任意字符 如 [abc][^abc][a-d] (使用中横线一定要由小到大排列)
2.2原字符介绍
1.元字符是一种特殊的字符(包含限定符),是用来修饰原子的不可单独使用,在原子后面声明即可
如: \d* (*)表示一个十进制数可重复出现任意次数的 字符序列。 end$ ($)表示以end结尾。
元字符集
"*" 表示当前的原子可以出现任意次(0次到多次)。
"+" 表示当前的原子可以出现至少1次(1次到多次)。
"?" 表示当前的原子可以出现最多1次(0次或1次)。
"." 表示除换行符意外的任意字符
"|" 表示或者的意思
"{n}" 表示前面的原子应该出现的个数 {n,m}n到m次{n,}n到多次
"()" 2.3模式单元(重点)
"\b" 表示一个边界
"\B" 表示一个非边界
"^" 表示以什么字符开头
"$" 表示以什么字符结尾
2.正则中的贪婪匹配和非贪婪匹配
例如:用 /ab.*c/ 匹配字符串"abcabc" 来说明问题
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配.如上面实例将会匹配到 abcabc 全部的字符串(贪得无厌)
非贪婪匹配:就是匹配到结果就好,'/ab.*?c/'将匹配最少的字符,结果匹配到 abc。
正则中默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。取消贪婪匹配还有一下几种方式
*? 重复任意次 尽可能的少重复(最常用)
+? 重复1次或多次尽可能的少重复
?? 重复0次或一次尽可能少重复
{n,m}? 重复n到m次尽可能少重复
3.正则中的模式单元(捕获分组)
我们可以把多个元子及原字符由小括号包裹起来,形成一个大的元子,大名叫做分组。
例如:\d{4}-(\d{2})-\1 可以匹配2016-12-12 其中12就是一个模式单元
括号的作用:
1.改变优先级 可以使内部形成一个整体 作为大元子使用
2.反向引用 \1 表示前面第一个括号括起来的内容 如:上边例子\1 引用了括号中匹配到的内容 所以也是12
3.作为大原子 “/(abc){2}/” 其中 (abc)是一个大原子 匹配 abcabc
4.取消模式单元 (?:模式)只作为一个整体或是改变优先级不能被引用或输出
反向引用实例
字符串 "abcdefj"
模式 /([ab])/ 匹配到了a那么作为括起来的内容可以被反向引用,这时我们这样写模式 /([ab])\1/ 该语句所表达的意思是 我不管第一个匹配的是a还是b反正作为\1表示跟第一个保持一致 第一个是a那么\1表示的就是a,第一个是b \1表示的也是b 这样匹配的结果不是aa就是bb,所以再匹配字符串就失败了。
需要注意的是 如果正则外围使用双引号的话 反向引用时使用两个反斜杠 如\1 进行转义
4.模式修正符
模式修正符是对整个正则表达式调优作用的,是正则的表达扩展是可选的。如是否忽略大小写 是否忽略模式中的空白等。
常用模式修正符
“i” 表示和模式进行匹配时忽略大小写
“m” 默认情况将字符串视为一行
“s” 元字符中的 (.) 点可以被视作换行符
“x” 模式中的空白忽略不计
“a” 同^ 表示以什么开头
“z” 同$ 表示以什么结尾
“U” 表示取消贪婪模式(建议使用*?代替本参数)
“u” 模式字符串被认为是utf-8字符
举例说明:
“/hello tom/i” 模式修正符指定了i 所以匹配字符串 “HELLO TOM” 也是可以的
3正向反向预查
1.正向预查
辅助条件 在查找内容的右边
1.1正向匹配
我们要查找的内容右边必须出现指定的信息,并且其是辅助条件 不作为结果的一部分。
/pattern(?=模式)/ 其中(?= )包裹的是辅助条件(可以通过具体的正则进行设置)
例如: 小写字母字符串右面要出现连续的数字信息
pattern = "/[a-z]+(?=\d+)/";
beijing2008 √ shanghai@@@ X
1.2正向不匹配
我们要查找的内容右边不能出现指定内容,右边的内容是辅助信息不作为结果返回。
/pattern(?!模式)/ 其中(?! )包裹的是辅助条件(可以通过具体的正则进行设置)
例如: beijing后面不能出现连续数字
pattern = "/[a-z](?!\d+)/";
beijing2008 X shanghai@@@ √
2反向预查
辅助条件在查找内容的左边
2.1 反向匹配
左边必须出现指定的信息
/(?<=模式)pattern/ pattern是匹配内容 左边括号部分是辅助内容不作为结果
2.2 反向不匹配
左边不能出现指定信息
/(?<!模式)pattern/ pattern是匹配内容 左边括号部分是辅助内容不作为结果