正则表达式语法
正则表达式是由一般字符(比方数字、字母、标点和用来示意特定字符或字符集的元字符)以及特别字符(用作限制前提或特别功用的字符)构成的笔墨情势。
一般字符
一切数字、小写字母、大写字母、标点都属于一般字符。
而为了婚配除以上列出的字符集以外的字符,或许婚配特定局限内的恣意字符,须要运用元字符。元字符分直接量字符和字符类。
直接量字符
字符 | 形貌 |
---|---|
uXXXX | 由16进制数XXXX指定的unicode字符 |
xNN | 由16进制数NN指定的拉丁字符 |
o | NUL字符(u0000) |
t | 制表符(u0009) |
n | 换行符(u000A) |
v | 垂直制表符(u000B) |
f | 换页符(u000C) |
r | 回车符(u000D) |
字符类元字符
字符类元字符用来婚配特定局限内的字符。一个字符类可以婚配它所包括的恣意字符。
字符 | 形貌 |
---|---|
. | 除了换行和行结束符以外的一切单个字符 |
w | 等价于[0-9a-zA-Z] |
W | 除了w以外的一切字符 |
s | 任何Unicode空白符 |
S | 任何非Unicode空白符的字符(局限比w大) |
d | 等价于[0-9] |
D | 除了d以外的一切字符 |
[…] | 方括号内的恣意字符 |
1 | 除了方括号内字符集的恣意字符 |
特别字符
反复
当须要婚配多个指定的字符时,须要用到一些特地的特别字符来示意反复婚配的次数。
字符 | 形貌 |
---|---|
{n,m} | 婚配最少n次,但不能超过m次 |
{n,} | 婚配最少n次,无上限 |
{n} | 婚配n次 |
? | 婚配0次或1次,等价于{0,1} |
+ | 婚配1次或屡次,无上限,等价于{1,} |
* | 婚配0次或屡次,无上限,等价于{0,} |
反复字符须要与一般字符合营运用,如[a-z]{3,5},即婚配3个到5个小写字母。
锚字符
当须要婚配以指定字符开首或末端的字符串时,须要用到锚字符。
字符 | 形貌 |
---|---|
^ | 婚配字符串的开首,在多行检索中,婚配一行的开首 |
$ | 婚配字符串的末端,在多行检索中,婚配一行的末端 |
(?=p) | 零宽正向先行断言,请求接下来的字符都与p婚配,婚配效果不包括p |
(?!p) | 零宽负向先行断言,请求接下来的字符不能和p婚配 |
b | 婚配一个字边境(须要和其他表达式合营运用,零丁运用[b]示意退格符) |
B | 婚配一个非字边境 |
例:须要婚配以字母、下划线或$开首的字符串来校验变量名是不是正当,可以运用/^[a-zA-Z_$].*/
注:^在方括号[]内部示意反向婚配。
零宽先行断言可以将任何正则表达式都做为末端锚点,q(?=p)示意婚配一切以p末端的q字符串,婚配效果仅包括q部份,不包括锚点p。
例:婚配以”.”末端的字符串,可以运用/w+(?=.)/g
则婚配’a.b.c.d.e.f’的效果为[‘a’,’b’,’c’,’d’,’e’]。f后没有.,所以不被婚配。
q(?!p)示意婚配一切不以p末端的q字符串。
注:javascript不支持后行断言,即不能将正则表达式作为最先锚点。
b可以用来婚配一个单词的开首或末端。例:婚配String中的Str用/bStr/,婚配String中的ing用/ingb/
B可用来婚配一个单词的中心部份。例:婚配String中的trin用/BtrinB/
挑选、分组和援用字符
字符 | 形貌 |
---|---|
| | 挑选婚配,“|”左侧的表达式和右侧的表达式皆可婚配 |
(…) | 分组婚配,将几个项组合为一个单位,这个单位可以用”*”,”+”,”?”,”|”,”{n,m}”等标记加以润饰。而且可以记着和这个组合相婚配的字符。 |
(?:…) | 非捕捉性分组,只担任婚配,不影象与该组相婚配的字符 |
(?:…)和(…)的差别仅仅存在与婚配效果,当须要纪录某一部份婚配项时,用(…)。若只是用来婚配,后续不须要运用分组婚配到的字符串,则用(?:…)
转义字符
字符 | 形貌 |
---|---|
\ |
RegExp运用
RegExp实例化要领
RegExp实例化有两张体式格局。一种经由过程字面量实例化,一种经由过程new RegExp()组织函数实例化
var exp = / pattern / flags; //RegExp字面量
var exp = new RegExp("pattern","flags"); //RegExp组织函数
flags用来示意正则表达式的行动。可选项有g,i,m三个标识,可同时定义一个或多个标识。
g:global,示意全局情势。flags中包括g时,表达式婚配一切可以婚配上的字符串;假如没包括g时,则当婚配到第一个字符串时,即住手婚配。
i:case-insentive,示意疏忽大小写。flags中包括i时,表达式婚配时疏忽字符串的大小写。
m:multi-line,示意多行婚配。flags中包括m时,表达式婚配到一行文本末端时还会继承查找下一行中是不是存在婚配项。
pattern即正则表达式语句。
RegExp组织函数上风在于可以动态传入正则表达式。
RegExp实例属性
global
boolean值,示意是不是设置了g标志。
ignoreCase
boolean值,示意是不是设置了i标志。
multiline
boolean值,示意是不是设置了m标志。
source
正则表达式的字符串示意,根据字面量情势而非传入组织函数中的字符串情势返回。
lastIndex
整数,示意最先搜刮下一个婚配项的字符位置,从0 算起。
例:
var exp = /\[bc\]at/gi;
exp.global;//true
exp.ignoreCase;//true
exp.multiline;//false
exp.source;//“\[bc\]at”
RegExp实例要领
exec()
exec要领接收一个参数,即须要运用情势的字符串,然后返回包括第一个婚配项信息的数组,或许在没有婚配项时返回null。返回的数组是Array实例,但还包括分外两个属性:index和input。
一句句诠释。
返回包括第一个婚配项信息的数组,或许在没有婚配项时返回null:
这里分两种状况,一种是global婚配,一种黑白global婚配。
global情势实行exec()婚配胜利一次今后,再次实行exec()时,会夙昔一次婚配的末了一名最先继承向后婚配。例:
var exp = /.at/g
var matches = exp.exec('cat, bat, sat, fat'); //第一次婚配
matches.index => 0
matches.input => 'cat, bat, sat, fat'
matches => ['cat']
exp.lastIndex => 3
matches = exp.exec('cat, bat, sat, fat'); //第二次婚配
matches.index => 5
matches.input => 'cat, bat, sat, fat'
matches => ['bat']
exp.lastIndex => 8
...
非global情势实行exec()婚配胜利一次今后,再次实行exec()时,会从头最先从新婚配。
var exp = /.at/
var matches = exp.exec('cat, bat, sat, fat'); //第一次婚配
matches.index => 0
matches.input => 'cat, bat, sat, fat'
matches => ['cat']
exp.lastIndex => 0
matches = exp.exec('cat, bat, sat, fat'); //第二次婚配
matches.index => 0
matches.input => 'cat, bat, sat, fat'
matches => ['cat']
exp.lastIndex => 0
返回的数组是Array实例:
当运用(…)分组婚配时,一次exec()会婚配到多个效果
var exp = /(there)\s+(you)\s+(are)/;
var matches = exp.exec('hey, there you are my dear');
matches = ["there you are", "there", "you", "are"];
matches[0]婚配全部表达式字符串。
matches[1]婚配第一个(…)内的字符串,以后以此类推。
补充申明:含(?:…)非捕捉分组的表达式实行exec后返回的数组中不包括(?:…)婚配的字符串。非捕捉性分组(?:…)和捕捉性分组(…)的区分就在这里。
属性index和input:
index示意婚配项在字符串中的肇端位置。
input示意运用正则表达式的字符串。
test()
test要领接收一个参数作为须要运用情势的字符串,在情势与该参数婚配的状况下返回true,不然返回false。在只想晓得目的字符串与某个情势是不是婚配,但不须要晓得其文本内容的状况下,运用这个要领非常轻易。因而,test()要领经常被用在if 语句中。
用于情势婚配的string要领
string有四个要领可以将正则表达式作为参数传入。
search()
str.search(exp)返回str中第一个与exp表达式婚配的字符串的肇端位置。假如找不到婚配项,返回-1。假如search传入的参数是一个string,则起首会经由过程RegExp组织函数将其转换为正则表达式。search不支持全局搜刮,它会疏忽global标识。
'JavaScript'.search(/script/i) => 4
replace()
str.replace(exp, replaceStr)第一个参数是一个正则表达式,第二个参数是要替代成的字符串。假如exp带有global标识,那末源字符str中一切与exp表达式婚配的子串都会被替代。假如不带g,str中仅第一个与exp婚配的子串会被替代。
text.replace(/javascript/gi, 'JS') //将text全文中一切javascript改成JS
replaceStr中假如涌现$加数字N的字符串,示意第N个子表达式相婚配的文本。
text.replace(/'([^']*)'/g, '"$1"') //将text全文中一切被''援用的子串替代成被""援用。
match()
str.match(exp)返回一个由婚配效果构成的数组。
该数组不同于RegExp实例要领exex()返回的数组。当有global标识时,match返回全局婚配到的一切字符串构成的数组;当没有global标识时,match就返回第一个婚配到的字符串构成的单位素数组。
'11+2=13'.match(/\d/g) => ['1','1','2','1','3']
'11+2=13'.match(/\d/) => ['1']
match要领不会返回捕捉性组合婚配到的子串,(…)分组婚配在match要领中不会像RegExp实例要领exec()一样返回婚配的子串。
split()
当split要领传入的参数为正则表达式时,这使得split()要领非常壮大。比方,可以指定分隔符,许可双方可以留有恣意多的空白符:
'1 , ,2 , 3 , 4 , 5'.split(/\s*,\s*/) => ['1','2','3','4','5']
- … ↩