javascript正則表達式

定义一个正則表達式

能够用字面量

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開始匹配。所以,非贪婪模式并不表示最短匹配。

选择、分组和引用

选择

|

匹配abcdef

/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方法。返回第一个满足条件的匹配结果在整个字符串中的位置。假设没有不论什么匹配,则返回-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' ]

空格能够直接用/, */


原文地址:https://www.cnblogs.com/brucemengbm/p/7117263.html