1

正则表达式

MDN文档

名词解析

1. 断言
断言,就是指明某个字符串前边或者后边,将会出现满足某种规律的字符串。

零宽断言:一般的正则表达式匹配,都是有 宽度 的,如:w+。 会将 '。' 一同匹配到。如果像 '。' 这样的内容只是一种判断条件,即不想被正则匹配到,就要使用到 零宽断言了。

(?=X)零宽度正先行断言:仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,w+(?=d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
(?!X)零宽度负先行断言:仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,w+(?!d) 与后不跟数字的单词匹配,而不与该数字匹配 。
(?<=X)零宽度正后发断言:仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。
(?<!X)零宽度负后发断言:仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配

目前JS只支持先行断言,后发断言还不支持。不过目前chrome支持了后发断言。

2. 分组

分组的类型(四种):

捕获型   - ()

非捕获型  - (?:)

正向前瞻型 - (?=)

反向前瞻型 - (?!)

其中只有捕获型分组会暂存匹配到的串。

一个分组中可以写多个表达式:(表达式1|表达式2|表达式3), 表示匹配其中任意一个表达式。
分组可以通过将某些表达式组合成整体,这样可以简化表达式的书写。例如将/testtesttest/写为/(test){3}/

3. 捕获与引用

1) 嵌套分组的捕获: 规则是以左括号出现的顺序进行捕获
<pre>
var reg = /((kid) is (a (doubi)))/
var str = "kid is a doubi"

reg.test( str ) // true

console.log(RegExp.$1) // kid is a doubi
console.log(RegExp.$2) // kid
console.log(RegExp.$3) // a doubi
console.log(RegExp.$4) // doubi
</pre>

通过 $1 可以引用捕获的字符串

2) replace中捕获的使用:

image.png

3) 反向引用

正则表达式里也能进行引用,这称为反向引用:
<pre>
var reg = /(w{3}) is 1/

reg.test('kid is kid') // true
reg.test('dik is dik') // true
reg.test('kid is dik') // false
reg.test('dik is kid') // false
</pre>

1引用了第一个被分组所捕获的串,换言之,表达式是动态决定的。

注意,如果编号越界了,则会被当成普通的表达式:

<pre>
var reg = /(w{3}) is 6/;

reg.test( 'kid is kid' ); // false
reg.test( 'kid is 6' ); // true
</pre>

3. 字符集合

通常字符集合有由[]方括号括起来。
image.png

方法

exec、test、match、replace
segmentfault文章

replace默认只替换第一个匹配到的字符串。
mdn文档RegExp对象

  • JavaScript exec() 方法

RegExpObject.exec(string)
exec() 方法用于检索字符串中的正则表达式的匹配,返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null;
情况 1)RegExp为非全局正则表达式;
情况 2)RegExp为全局正则表达式,exec()可以像迭代器那样,多次调用,获得匹配值;

  • JavaScript test() 方法

RegExpObject.test(string)
如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false

  • String.prototype.replace()方法

W3 replace方法
MDN replace方法

正则相关属性和方法

更多博客:https://github.com/Lmagic16/blog


Lmagic16
174 声望10 粉丝