《深入理解JavaScript》—— 正则表达式

(1) 正则表达式语法:

1. 原子:常规

① 特殊字符

下面所有的字符都有特殊的意义:

^ $ . * + ? ( ) [ ] { } |

② 模式字符

除了上述的一些特殊字符,所有字符都匹配它们自身。

③ 点(.)

匹配任意的JavaScript字符(UTF-16编码单元),除了行结束符(回车符、换行符等)。要真正匹配任何字符,请使用[sS]。例如:

var a = /[sS]/.test('
');
console.log(a);  // true

④ 字符转义(匹配单个字符)

● 特殊的控制字符包括f(翻页符), (换行符), (回车符), (水平制表符),v(垂直制表符)

● 匹配NUL字符(U0000)

● 任何控制字符:cA~xZ

● Unicode字符转义:u0000~xFFFF

● 十六进制字符转义:x00~xFF

⑤ 字符分类转义(匹配字符集合中的一个字符)

● 数字: d 匹配任意数字(同[0-9]);D 匹配任何非数字(同[^0-9])。

● 字母数字字符: w 匹配任意拉丁文字母数字和下划线(同[A-Za-z0-9_]);W 匹配所有w不匹配的字符。

● 空格: s 匹配空白字符(空格、制表符、换行符、回车符、翻页符和所有Unicode空格等);S 匹配所有非空白字符。

2. 原子: 字符类

字符类的语法如下(《》表示内部是一个代码):

● [《charSpecs》] 至少匹配charSpecs中的任意一个字符。

● [^《charSpecs》] 匹配不属于charSpecs中的任意一个字符。

所有字符的匹配规范如下:

① 源字符与自身匹配。大多数字符都会源字符。只有3个不是源字符: ] -。通常你可以通过反斜杠转义

② 分类转义:前面列出的任何字符转义和字符分类转义都是允许的。

③ 范围包括源字符或分类字符,后面跟随者一个连接符(-),之后接着源字符或分类转义。

3. 原子: 分组

● (《pattern》)是捕获组。任何匹配pattern的内容都可以通过反向引用访问或作为匹配操作的结果。

● (?:《pattern》)是非捕获组。pattern仍旧匹配输入,但不保存捕获的内容。因此,这种分组没有数字可以引用。

4. 量词

量词可以跟随在任何原子(包括字符类和分组)后。

?  表示从未匹配或只匹配一次。

*  表示匹配零次或多次。

+  表示匹配一次或多次。

{n}  表示完全匹配n次。

{n,}  表示匹配n次或多次。

{n,m}  表示匹配最少n次,最多匹配m次。

5. 断言

下面的断言,用来检测输入的当前位置。

^  只匹配输入的开始位置。

$   只匹配输入的结束位置。

  只匹配单词的边界。不要与[]混淆,它匹配一个退格。

B  只匹配非单词边界。

(?=《pattern》)  正向肯定断言:只匹配pattern所匹配的接下来的内容。pattern只是用来向前查找,但会忽略匹配的pattern部分。

(?!《pattern》)  正向否定断言:只匹配pattern不匹配的接下来的内容。pattern只是用来向前查找,但会忽略匹配的pattern部分。

6. 析取(或)

析取运算符(|)分离两个选择方案;必须匹配其中一个方案。

析取操作符结合很弱,所以你必须小心,选择的方案不会拓展得太长。换句话说,析取操作符甚至比^和$结合更弱。

(2) 标识

g  给定的正则表达式可以匹配多次,他会影响几种方法,尤其是replace()

i   试图匹配给定的正则表达式时忽略大小写

m  在多行模式中,开始操作符^和结束操作符$匹配每一行,而不是输入的整个字符串。

(3) 实例方法

1. RegExp.prototype.test(): 是否存在匹配

test()方法用来检查正则表达式是否匹配字符串str。

2. String.pototype.search(): 匹配位置的索引

如果存在匹配,返回发现匹配位置的索引。否则,返回值是-1。

3. RegExp.prototype.exec(): 捕获分组

不设置/g: 只捕获第一次匹配的分组(调用一次)。

设置/g: 捕获所有匹配的分组(重复调用;如果没有任何匹配,返回null)。

4. String.prototype.match(): 捕获分组或返回所有匹配的子字符串

不设置/g: 捕获分组。

设置/g: 返回所有匹配的子字符串的数组。

5. String.prototype.replace():查找和替换

原文地址:https://www.cnblogs.com/luohaoran/p/5987588.html