javascript正则表达式

来源:互联网 发布:查看数据库的存储过程 编辑:程序博客网 时间:2024/06/18 18:17

定义一个正则表达式

可以用字面量

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"

引用

\n

从1开始

不能在字符类中使用引用

指定匹配位置

字符 描述 ^ $ \b 匹配单词边界 \B 匹配非单词边界 (?=p) x(?=y)称为先行断言(Positive look-ahead),x只有在y前面才匹配,y不会被计入返回结果。 (?!p) x(?!y)称为后行断言(Negative look-ahead),x只有不在y前面才匹配,y不会被计入返回结果。


[\b]匹配的是退格

关于(?=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\n") // false/world$/m.test("hello world\n") // true

上面的代码中,字符串结尾处有一个换行符。如果不加m修饰符,匹配不成功,因为字符串的结尾不是world;加上以后,换行符被省略,匹配成功。


属性和方法

ignoreCase:返回一个布尔值,表示是否设置了i修饰符,该属性只读。

global:返回一个布尔值,表示是否设置了g修饰符,该属性只读。

multiline:返回一个布尔值,表示是否设置了m修饰符,该属性只读。

var r = /abc/igm;r.ignoreCase // truer.global // truer.multiline // true

lastIndex:返回下一次开始搜索的位置。该属性可读写,但是只在设置了g修饰符时有意义。

source:返回正则表达式的字符串形式(不包括反斜杠),该属性只读。

var r = /abc/igm;r.lastIndex // 0r.source // "abc"

test()

正则对象的test方法返回一个布尔值,表示当前模式是否能匹配参数字符串。

/cat/.test('cats and dogs') // true

如果正则表达式带有g修饰符,则每一次test方法都从上一次结束的位置开始向后匹配。

r.lastIndex // 0r.test(s) // truer.lastIndex // 2r.test(s) // truer.lastIndex // 4r.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 // 1arr.input // "_abbba_aba_"

如果正则表达式加上g修饰符,则可以使用多次exec方法,下一次搜索的位置从上一次匹配成功结束的位置开始。

var r = /a(b+)a/g;var a1 = r.exec("_abbba_aba_");a1 // ["abbba", "bbb"]a1.index // 1r.lastIndex // 6var a2 = r.exec("_abbba_aba_");a2 // ["aba", "b"]a2.index // 7r.lastIndex // 10var a3 = r.exec("_abbba_aba_");a3 // nulla3.index // TypeError: Cannot read property 'index' of nullr.lastIndex // 0var a4 = r.exec("_abbba_aba_");a4 // ["abbba", "bbb"]a4.index // 1r.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' ]

空格可以直接用/, */


1 0
原创粉丝点击