首页 > 代码库 > 正则表达式理论基础

正则表达式理论基础

---恢复内容开始---

一.语法

正则表达式用来匹配使用,例如,我们使用正则表达式匹配手机号,匹配邮箱,匹配密码等等

在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]+$/

(?_)表示不能以下划线_开头

(?_.*?_$)不能以_结尾

 

正则表达式理论基础