首页 > 代码库 > 正则表达式理论基础
正则表达式理论基础
---恢复内容开始---
一.语法
正则表达式用来匹配使用,例如,我们使用正则表达式匹配手机号,匹配邮箱,匹配密码等等
在ECMAscript中通过 RegExp类型来支持正则表达式的,使用下面的语法创建正则表达式:
var expression=/pattern/flags
在上面的语法中,pattern(模式)部分可以是任何简单或者复杂的正则表达式,
或者直接使用特殊的直接量语法来定义,代码如下:
var expression=new RegExp("pattern","flags")
如上,上面是两种定义正则表达式的方法。
特别,对于使用RegExp构造函数,传递给这个函数的是字符串,因为不能把表达式字面量传递给构造函数,因此在一些情况下要进行双重转义:
所有的元字符都必须要进行双重转义:(这是一个坑)
对于flags则是表明应用正则表达式的范围:
对于flags而言:存在着三种行为:
g:表示全局模式,这个模式是要应用于所有的字符串。
i:表示不区分大小写,确定匹配项的时候忽略模式与字符串的大小写。
m:表示多行模式。
二.pattern(模式)部分详解
pattenr部分即是正则表达式部分:正则表达式用来匹配给定的字符串
下面是正则表达式的方法分类:
2.1 直接量字符
字符类 | 匹配 |
字母和数字字符 | 自身 |
\o | NULL字符 |
\t | 制表符 |
\n | 换行符 |
\v | 垂直制表符 |
\f | 换页符 |
\r | 回车符 |
\xnn |
由十六进制数nn指定的拉丁字符 例如 \x0A等价于\n |
\uxxxx
|
由十六进制数xxxx指定的unicode字符,例如\u0009等价于\t |
\cx | 控制字符 ^X 例如 \cJ等价于换行符\n |
对于特殊字符(这类字符在js中含有特殊的含义):
例如: 对于元字符: ( [ { \ ^ $ | ) ? * + . ] }
我们要想直接匹配上面的元字符,我们需要添加在这些元字符之前添加前缀 "\" 来实现。
同时 为了在使用REG构造函数来匹配的字符,我们对于上面元字符的匹配使用双重转义来进行匹配
即:匹配 “\”字符,我们要在构造函数中使用 \\\来进行转义
2.2使用方括号([ ])来定义的正则表达式:自定义可以匹配多个字符
表达式 | 可以匹配 |
方括号内含有多个字符,表示匹配多个字符中的一个 [abc12] |
表示匹配字符 "a"或"b"或"c"或"1" |
方括号内要匹配的字符之间存在着短横线,表示匹配到一个范围 对于[a-z] [0-3] |
表示匹配 字母 "a"到 "z"之间的任意一个字母 表示匹配数字0到3之间的任意一个数字 |
[a-z0-3] | 匹配 "a" 到 "z" 或者"0" 到 "3"之间的任意一个字符 |
同时,我们还有预先定义的特殊字符用来替代方括号内的内容:
特殊的字符 | 意义 |
\w | 任何ASCII符组成的单词,等同[a-zA-Z0-9] |
\W | 任何不是ASCII符组成的单词,等同于 [^a-zA-Z0-9] |
\s | 任何unicode空白字符 |
\S | 任何非unicode空白符的字符和\W的意思是不一样的 |
\d | 任何ASCII数字,等价于[0-9] |
\D | 除了ASCII数字之外的任何字符,等价于[^0-9] |
2.3 表示量词的正则表达式:
对于量词,分为贪婪量词和非贪婪量词,区分这两种量词的方式是判断正则表达式后面有没有跟有问号(?)
贪婪量词:允许尽可能多的匹配,允许后续的正则表达式继续匹配
非贪婪量词:尽可能少的匹配,例如 /a+?/匹配 aaa的时候,因其尽可能少的匹配,所以只能匹配到 a元素
量词 | 含义 |
{n} | 匹配前一项n次 |
{n,} | 匹配前一项至少n次 |
{n,m} | 最少 n 次,不超过m次 |
? | 匹配 0次或1 次 |
* | 匹配0 次或者多次 |
+ | 1次或者多次 |
2.4表示匹配位置的正则表达式:
字符 | 含义 |
^ | 匹配字符串的开头,在多行检索中,匹配一行的开头 |
$ | 匹配字符串的结尾,在多行检索中,匹配一行的结尾 |
\b | 匹配一个单词边界,匹配字符串的开头或者结尾的位置 |
\B | 匹配非单词边界的位置 |
例如:
分别用两种方式来表示这种行为:
var Reg=/\B[s]cript/;
或者 var Reg=new RegExp("///B/[s/]cript")//"注意这儿进行了转义"对于 "/"是通过 "//"来进行转义的,因为对于元字符要进行双重转义
Reg.test("javascript") 返回的是true 因为单词script不在边界的位置
2.5表示选择,分组和引用的正则表达式:
在正则表达式中圆括号的作用:
()内的内容表示的是一个表达式,()本身不匹配任何东西,也不会限制匹配任何东西,()的作用是将括号的的内容当做一个表达式来进行匹配;
()和[]的区别在于:[ ]用来匹配方括号内的一个字符,而括号用来匹配括号内的表达式;
对于()而言,存在着不同的行为:
字符 | 含义 |
"|" | 表示匹配的是左边的字符串或者右边的字符串,如果左边的字符串被匹配到,那么右边的字符串则不再进行匹配 |
(...) | 将几个项组合成一个单元,这个单元可以通过“+”,“*”,“?”等修饰,记住和这个匹配的字符串以供以后使用 |
(?:...) | 只组合单元,但是不会记忆匹配的项 |
\n | 和第 n个分组第一次匹配的字符相匹配,组是圆括号的表达式,组索引是从左到右的左括号数,注意:因为对于(?:....)而言,这个不会记忆匹配的项,因此这个分组没有组索引号。 |
在RegExp中存在着$1-$9的属性,这个属性的意思是获得匹配字符串中匹配项的值,因为他会将匹配的项通过$number这个属性保存下来,对于$1-$9这个数字索引表示的是从左到右左括号"("的序号,代码如下:
var Reg=/(abc+..)(d)/g;
var Regstr=Reg.exec("abcdfg") alert(RegExp.$1);// abcdf
alert(RegExp.$2);//d
如上:使用这个属性获得的是正则表达式圆括号中的表达式,数字代表圆括号的索引
另外:
对于 (?:...)表示不会记忆匹配的项
例如:
var Reg=/(?:abc)(d)/g;
var Regstr=Reg.exec("abcdfg") alert(RegExp.$1);// d
alert(RegExp.$2);//""
如上:
2.6:上面几种方式的组合使用:
/^\d+$/:匹配 数字[0-9]之间的数字一次或者多次 其中 \d 相当于 [0-9] "+"号表示匹配数字一次到多次
/^@+\..+$/:匹配 @后面的多个字符,直到遇见点号为止,在匹配点号后面的一或多个字符,一直到字符串结尾,因为这里点号是特殊符号,因此使用转义符进行转义
/^[\u4E00-\u9FA5]{2,4}$/;表示 2到4个汉字
/[a-zA-Z0-9_\u4e00-\u9fa5]+/至少一个汉字,数字,字母,下划线
使用一个正则表达式,只含有汉字,数字,字母,下划线,不能以下划线开头和结尾:
/^(?!_)(?!.*?_$)[a-zA-Z0-9_\u9fa5]+$/
(?_)表示不能以下划线_开头
(?_.*?_$)不能以_结尾
正则表达式理论基础