定义一个正則表達式
能够用字面量
var regex = /xyz/;
var regex = /xyz/i;
也能够用构造函数
var regex = new RegExp('xyz');
var regex = new RegExp('xyz', "i"); // 第二个參数表示修饰符
正則表達式组成
直接量字符
直接量字符如a
特殊含义的字符须要转义
假设使用RegExp方法生成正则对象,转义须要使用两个斜杠。由于字符串内部会先转义一次。
(new RegExp("1+1")).test("1+1") // false
(new RegExp("1\+1")).test("1+1") // true
字符类
字符 | 匹配 |
---|---|
[…] | 方括号内的随意字符 |
[^…] | 不在方括号内的随意字符 |
- | 连字符 |
. | 除了换行符和行结束符 |
w | 不论什么ASCII字符组成的单词=[a-zA-Z0-9] |
W | =[^a-zA-Z0-9] |
s | 空白字符 |
S | 非空白字符 |
d | ASCII数字=[0-9] |
D | [^0-9] |
连字符-
。[1-31]
表示1至3。而不是到31
字符类的连字符必须在头尾两个字符中间,才有特殊含义。否则就是字面含义。比方。[-9]就表示匹配连字符和9,而不是匹配0到9。
反复
字符 | 描写叙述 |
---|---|
{n,m} | |
{n,} | |
{n} | |
? | 0次或1次 |
+ | 在于等于1次 |
* | 在于等于0次 |
非贪婪反复
在上面的反复字符后加上?
就是非贪婪反复。
如/a+/
匹配字符串aaa
时,会匹配aaa
。而/a+?/
会匹配a
。
正則表達式的模式匹配总是会寻找字符串中第一个可能匹配的位置。如/a+b/
匹配aaab
时,会匹配aaab
。/a+?
b/也会匹配’aaab’,都是从aaab
中的第一个a
開始匹配。所以,非贪婪模式并不表示最短匹配。
选择、分组和引用
选择
|
匹配ab
或cd
或ef
/ab|cd|ef/
分组
()
var m = "abcabc".match(/(.)b(.)/);
m; // ["abc", "a", "c"]
非捕获组
(?:x)称为非捕获组(Non-capturing group)。表示不返回该组匹配的内容。即匹配的结果中不计入这个括号。
var m = "abc".match(/(?:.)b(.)/);
m[1]; // "c"
引用
从1開始
不能在字符类中使用引用
指定匹配位置
字符 | 描写叙述 |
---|---|
^ | |
$ | |
匹配单词边界 | |
B | 匹配非单词边界 |
(?=p) | x(?=y)称为先行断言(Positive look-ahead),x仅仅有在y前面才匹配。y不会被计入返回结果。 |
(? !p) |
x(?!y)称为后行断言(Negative look-ahead),x仅仅有不在y前面才匹配。y不会被计入返回结果。 |
[]
匹配的是退格
关于(?=p)
和(?!p)
var m = "abc".match(/b(?=c)/);
m; // "b"
var m = "abd".match(/b(?
!c)/);
m; // ["b"]
修饰符
字符 | 描写叙述 |
---|---|
i | 不区分大写和小写 |
g | 默认情况下,第一次匹配成功后。正则对象就停止向下匹配了。g修饰符表示全局匹配(global),加上它以后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换。 |
m | 字符串的头部或尾部可能会有换行符。 默认情况下,正则对象会将换行符算入字符串的开头或结尾。 m修饰符表示多行模式(multiline),加上它以后。正则对象会忽略字符串头部或尾部的换行符,即^和$会忽略换行符。 |
关于m
/world$/.test("hello world
") // false
/world$/m.test("hello world
") // true
上面的代码中。字符串结尾处有一个换行符。假设不加m修饰符,匹配不成功,由于字符串的结尾不是world;加上以后,换行符被省略,匹配成功。
属性和方法
ignoreCase:返回一个布尔值,表示是否设置了i修饰符,该属性仅仅读。
global:返回一个布尔值。表示是否设置了g修饰符,该属性仅仅读。
multiline:返回一个布尔值。表示是否设置了m修饰符,该属性仅仅读。
var r = /abc/igm;
r.ignoreCase // true
r.global // true
r.multiline // true
lastIndex:返回下一次開始搜索的位置。该属性可读写。可是仅仅在设置了g修饰符时有意义。
source:返回正則表達式的字符串形式(不包括反斜杠),该属性仅仅读。
var r = /abc/igm;
r.lastIndex // 0
r.source // "abc"
test()
正则对象的test方法返回一个布尔值。表示当前模式能否匹配參数字符串。
/cat/.test('cats and dogs') // true
假设正則表達式带有g修饰符,则每一次test方法都从上一次结束的位置開始向后匹配。
r.lastIndex // 0
r.test(s) // true
r.lastIndex // 2
r.test(s) // true
r.lastIndex // 4
r.test(s) // false
带有g修饰符时,能够通过正则对象的lastIndex属性指定開始搜索的位置
var r = /x/g;
var s = '_x_x';
r.lastIndex = 4;
r.test(s) // false
exec()
正则对象的exec方法,能够返回匹配结果。假设发现匹配。就返回一个数组,每一个匹配成功的子字符串,就是数组成员,否则返回null。
var s = '_x_x';
var r1 = /x/;
var r2 = /y/;
r1.exec(s) // ["x"]
r2.exec(s) // null
假设正则表示式包括圆括号(即要求“组匹配”),则返回的数组会包括多个元素。
当中,第一个元素是整个匹配成功的结果,后面的元素就是圆括号相应的匹配成功的组。
也就是说。第二个元素相应第一个括号,第三个元素相应第二个括号,以此类推。
exec方法的返回数组还包括下面两个属性:
input:整个原字符串。
index:整个模式匹配成功的開始位置(从0開始)。
var r = /a(b+)a/;
var arr = regex.exec("_abbba_aba_");
arr // ["abbba", "bbb"]
arr.index // 1
arr.input // "_abbba_aba_"
假设正則表達式加上g修饰符,则能够使用多次exec方法,下一次搜索的位置从上一次匹配成功结束的位置開始。
var r = /a(b+)a/g;
var a1 = r.exec("_abbba_aba_");
a1 // ["abbba", "bbb"]
a1.index // 1
r.lastIndex // 6
var a2 = r.exec("_abbba_aba_");
a2 // ["aba", "b"]
a2.index // 7
r.lastIndex // 10
var a3 = r.exec("_abbba_aba_");
a3 // null
a3.index // TypeError: Cannot read property 'index' of null
r.lastIndex // 0
var a4 = r.exec("_abbba_aba_");
a4 // ["abbba", "bbb"]
a4.index // 1
r.lastIndex // 6
字符串中与正則表達式相关的4个函数
match
match方法与正则对象的exec方法很相似:匹配成功返回一个数组,匹配失败返回null。
假设正則表達式带有g修饰符,则该方法与正则对象的exec方法行为不同。会一次性返回全部匹配成功的结果。
var s = "abba";
var r = /a/g;
s.match(r) // ["a", "a"]
r.exec(s) // ["a"]
设置正則表達式的lastIndex属性,对match方法无效。匹配总是从字符串的第一个字符開始。
search
字符串对象的search方法。返回第一个满足条件的匹配结果在整个字符串中的位置。假设没有不论什么匹配,则返回-1。
该方法会忽略g修饰符。
设置正則表達式的lastIndex属性,对match方法无效,匹配总是从字符串的第一个字符開始。
replace
它接受两个參数,第一个是搜索模式,第二个是替换的内容。
搜索模式假设不加g修饰符。就替换第一个匹配成功的值。否则替换全部匹配成功的值。
replace方法的第二个參数能够使用美元符号$,用来指代所替换的内容。
$ & 指代匹配的子字符串。
$` 指代匹配结果前面的文本。
$’ 指代匹配结果后面的文本。
$n 指代匹配成功的第n组内容。n是从1的自然数。
"hello world".replace(/(w+)s(w+)/,"$2 $1")
// "world hello"
"abc".replace("b", "[$`-$&-$']")
// "a[a-b-c]c"
replace方法的第二个參数还能够是一个函数,将匹配内容替换为函数返回值。
作为replace方法第二个參数的替换函数,能够接受多个參数。它的第一个參数是捕捉到的内容,第二个參数是捕捉到的组匹配(有多少个组匹配,就有多少个相应的參数)。
此外。最后还能够加入两个參数,倒数第二个參数是捕捉到的内容在整个字符串中的位置(比方从第五个位置開始)。最后一个參数是原字符串。
split
字符串对象的split方法依照正则规则切割字符串,返回一个由切割后的各个部分组成的数组。
该方法接受两个參数。第一个參数是分隔规则。第二个參数是返回数组的最大成员数。
'a, b,c, d'.split(',')
// [ 'a', ' b', 'c', ' d' ]
'a, b,c, d'.split(/, */)
// [ 'a', 'b', 'c', 'd' ]
'a, b,c, d'.split(/, */, 2)
[ 'a', 'b' ]
空格能够直接用/, */