javascript正则表达式(一)——语法

时间:2022-10-13 19:43:27

前言


js中类RegExp类表示正则表达式,具有强大的模式匹配、文本检索和替换功能。正则表达式的模式规则是由一个字符序列组成,包括所有字母和数字在内,大多数的字符都是按照直接量匹配字符,某些特殊字符并不按照字面含义匹配字符例如$等,当按照非字面含义匹配时使用需要利用反斜杠转义

可以采用下面两种方式创建RegExp对象:

eg:下面两种方式都可以匹配以s结尾的字符串

//方式一($匹配字符串的结尾),采用构造函数方式
var pattern = new RegExp("s$"); //方式二 ,采用正则表达式直接量的方式,定义在一对斜杠之间的字符
var pattern = /s$/;

注意: 在ECMAScript3中一个正则表达式在执行到它时会转换为一个RegExp对象,同一段代码所表示的正则表达式直接量的每次运算都返回同一个对象(区别于{}和[],每次会创建新的对象),而ECMAScript5中不是

    即ECMAScript3中RegExp对象会共享同一个实例,而在ECMAScript5中是两个独立的实例

字符


1、直接量字符

 

字母和数字字符: 自身

\o:        NUL字符

\t:       制表符

\n:        换行符

\v:       垂直制表符

\f:       翻页符

\r:         回车符

....

2、字符类

将直接量字符放进方括号内组成了字符类,一个字符类可以匹配它所包含的任意字符 eg:/[abc]/可以匹配a、b、c

字符类列表如下:

[....]:  方括号内任意字符

[^...]:   不在方括号内的任意字符

.   :    除换行符和其他Unicode行终止符之外的任意字符

\w   :  任意ASCII字符组成的单词,等价于[a-zA-Z0-9]

\W    :  任何不适ASCII字符组成的单词,等价于[^a-zA-Z0-9]

\s  :  任何Unicode空白符

\S  :  任何非Unicode空白符的字符

\d  :  任何ASCII数字,等价于[0-9]

\D  :  等价于[^0-9]

[\b] :   退格直接量

重复


/\d\d/可以匹配两个数字,如果位数很多时怎么办呢,可以采用如下方式:

{n}:   匹配前一项n次

{n,}:  匹配前一项n次或者是更多次

{n,m}:  匹配前一项至少n次,至多m次 

*  :   匹配前一项0次或者多次,等价于{0,}

+ :    匹配前一项1次或者多次,等价于{1,}

?  :    匹配前一项0次或者1次(即前一项是可选的)等价于{0,1}

上面这种方式是”贪婪的“匹配,即尽可能多的匹配。如果要”非贪婪的“匹配,可以在匹配的字符后加一个问号。

eg:/a+/ 和 /a+?/, 如果将aaa作为匹配字符串,前一种方式会匹配aaa,后一种方式只会匹配第一个a

当需要匹配aaab时 /a+b/和/a+?b/等价

分组


字符|用于分割供选择的字符,eg /ab|cd|ef/可以匹配字符串 ab或者cd或者ef。

选择项的尝试匹配次序是从左到右,知道发现匹配项,如果左边的选择项匹配就会忽略右边的匹配项,eg /a|ab/  匹配ab时只能匹配a

圆括号()


圆括号()作用:

1. 将单独的项组合为表达式

  eg:/java(script)?/ 可以匹配java或者javascript

2. 在完成模式中定义子模式,当一个正则表达式成功的与目标字符串相匹配时可以从目标串中抽出和圆括号中的子模式相匹配的部分

 eg: /[a-z]+(\d+)/   模式中  /[a-z]+\d+/可以匹配一个或者多个小写字母后加一个和多个数字,那么我们使用()将\d+括起来后,就可以从匹配项中抽取出数字部分。当我们更关心后面的数字时可以使用这种方式

3. 允许在同一正则表达式的后面引用前面的子表达式。 通过在反斜杠\后加一个或者多个数字来实现,这个数字指定了带圆括号的子表达式在正则表达式中的位置

  eg1: /(java(script)[abc]+)/ 中(script)可以使用\2来指代

  eg2: /[' "][^' "]*[' "]可以使用 /([' "])[^' "]*\1/替代

(?:....)


(?:)   把项组合成一个单元,但是不生成引用,区别于子表达式中的()

eg:在/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/中 \2与(fun\W*)匹配

锚(指定匹配位置)


锚用于指定匹配表达式出现的合法位置。最常用的锚元素是^用于匹配字符串的开始,锚元素$用于匹配字符串的结束

总结列表:

^ :  匹配字符串的开头,多行检索时用于匹配一行的开头

$ :  匹配字符串的结尾,多行检索时用于匹配一行的结尾

\b:  匹配一个单词的边界(区别于[\b]退格)

\B:  匹配非单词边界的位置

(?=p): 正向先行断言,接下来的字符与p匹配

(?!p): 负向先行断言,接下来的字符不与p匹配

举例说明下正向先行断言和负向先行断言:

eg1: /[Jj]ava([Ss]cript)?(?=\:)/  则改模式能匹配Javascript:is a very interesting language 中的Javascript,但是不能匹配Java is a very interesting language 中的Java

eg2:/Java(?! script)[A-Z]\w*/  能够匹配Java后跟随一个大写字母和任意多个ASCII单词,但是不能跟随Script

   例如它能匹配JavaBeans 不能匹配Javanese

修饰符


修饰符放在"/"之外,下面的修饰符可以任意组合

i:说明匹配模式不区分大小写

g:说明匹配模式时全局的,应该找出所有的匹配,而不是找到第一个就停止

m:多行执行模式,此时^和$除了匹配整个字符串的开始和结尾之外,还能匹配每行的开始和结尾

eg: /\bjava\b/i 可以匹配java Java JAVA等

  /JAVA$/im 可以匹配java Java\nis fun

例子


1)邮箱

/^[a-zA-Z0-9_-]+\@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/

注意


1.正则表达式中不允许双引号括起来的内容中有单引号,反之亦然.

2.在字符类中不能使用字表达式的引用

  eg:/([' "])[^\1]*\1/ 是非法的

相关方法:


见:javascript正则表达式(二)——方法