目录
1正则表达式
其中,元字符(metacharacters)也是由普通字符组成,具有特殊意义。比如 {3}
代表了将前面的字符或分组重复匹配三次,$
代表了匹配一行的结束位置。(更多的元字符请看下面的 表格。)
正则表达式常被用来执行复杂的 “搜索-替换” 、验证字符串格式是否正确。
当今的大多数程序设计语言都包含正则表达式。甚至包括脚本语言、编辑器、应用程序、数据库和一些命令行的工具也包含正则表达式工具。下面介绍 Javascript 中实现正则表达式的 Regex
对象。
1.1 创建
Regex
是 Javascript 的内置对象,描述一个字符串的匹配模式,为字符串操作提供了强大的匹配和替换方法。
和数组、对象差不多,Regex
对象的创建也有常量、构造函数、普通函数三种创建方式:
直接量语法
构造函数
普通函数
其中的 pattern
是正则表达式的匹配模式,由字符和元字符(表格)构成,attributes
是正则表达式的标记,可以是 "i"
、"g"
、"m"
三个字母或三个字符的任意组合:
"i"
:大小写不敏感"g"
:全局匹配(查找所有匹配而非在找到第一个匹配后停止)"m"
:多行匹配
在使用函数创建正则表达式的时候,如果 pattern 不是一个字符串,而是一个正则表达式,则忽略第二个参数:
1.2 对象属性
regexOjbect.source
属性是一个只读的字符串,包含了描述这个正则表达式的文本;regexOjbect.global
属性是一个只读的布尔值,表明这个正则表达式是否为具有标识"g"
;regexOjbect.ignoreCase
属性是一个只读的布尔值,表明这个正则表达式是否为具有标识"i"
;regexOjbect.multiline
属性是一个只读的布尔值,表明这个正则表达式是否为具有标识"m"
;regexOjbect.lastIndex
属性是一个数值,如果正则表达式有 “g” 标识,这个属性表明下一次检索的起始位置。
可以看到,当正则表达式匹配结束或失败时,regexOjbect.lastIndex
被重置。
1.3 对象方法
test
Regex.test
方法测试正则表达式指定的模式是否出现在字符串中,返回 true
或 false
。
compile
Regex.compile
方法可以在脚本执行过程中编译正则表达式,也可以改变和重新编译正则表达式。形式如下:
regexp
是一个正则表达式,用于替换 RegExpObject
。
modifier
是正则表达式的匹配属性( "i"
/ "g"
/ "i"
)。
如果缺省参数,RegExpObject
被重置为一个空的正则表达式 //
。
如果 regexp
是正则表达式本身,结果就是重新编译并重置它的属性,比如 lastIndex
。
exec
Regex.exec
方法用于检索字符串中正则表达式的匹配。形式如下:
Regex.exec
方法返回一个数组:
- 数组的元素,就是匹配的结果;
- 数组的属性
index
表示匹配发生的位置,input
表示原始字符串; - 未找到匹配返回
null
,而不是空数组[ ]
;
执行 exec
后:
- 如果匹配成功,正则表达式的属性
lastIndex
设为匹配文本后面的位置; - 如果匹配失败,正则表达式的属性
lastIndex
设为 0 。
非全局匹配的情况下,exec
的返回结果和 String.match
相同。
全局匹配的情况下,可以通过反复调用 exec
方法来遍历字符串中的所有匹配文本。
用 for
来遍历:
1.4 分组
正则表达式中,使用括号 ( )
进行分组。
分组的正则表达式有两个作用:一是可以让重复的模式作用于整个组而不是单一字符,另一个是可以用特殊转义序列对其进行引用。
其中使用 \n
引用前面第 n
个 捕获子表达式 的捕获结果。
分组的捕获结果,还可以用 RegExp 的静态属性 $1...$9
引用。在 string.replace
方法中:
在 string.replace
的 replacement
参数中 "$1" ... "$9"
拥有特殊意义,引用模式匹配过程中 捕获子表达式 捕获的结果。
也可以在 replacement
外使用 RegExp.$1 ... RegExp.$9
访问对应分组捕获的结果。
2元字符和正则表达式规则
Character | Description |
---|---|
\ |
\ 标志着下一个字符是一个特殊的字符。元字符拥有特殊的意义,如果想使用这些字符,需用
\ 转义:
|
^ |
^ 匹配字符串的开始位置。如果进行多行(Multiline)匹配,
^ 也会匹配
\n 、
\r 后面的位置。
|
$ |
$ 匹配字符串的结束位置。如果进行多行(Multiline)匹配,
$ 也会匹配
\n 、
\r 前面的位置。
|
* |
* 匹配前面的字符或者分组 0 次或多次。如
zo* 匹配 “zo” 和 “zoo”,甚至是 “z”。
|
+ |
+ 匹配前面的字符或者分组 1 次或多次。如
zo+ 匹配 “zo” 和 “zoo”,但不匹配 “z”。
|
? |
? 匹配前面的字符或者分组 1 次或多次。如
do(es)? 匹配 “do” 和 “does” 。
|
{n} |
{n} 匹配前面的字符或者分组
n 次。其中
n 是非负整数。如
o{2} 匹配
"food" 的 2 个
"o" ,不匹配
"do" 中的 1 个
"o" 。
|
{n,} |
{n,} 匹配前面的字符或者分组至少
n 次。其中
n 是非负整数。如
o{1} 匹配
"yahoo" 的 2 个
"o" ,也匹配
"yahooooooooo" 中的所有
"o" 。
|
{n,m} |
{n,m} 匹配前面的字符或者分组至少
n 次、至多
m 次。其中
n 和
m 都是非负整数。如
o{1,3} 匹配
"yahoo" 的前 3 个
"o" ,也匹配
"yahooooooooo" 中的前 3 个
"o" 。
注意:数字和逗号之间不能有空格。 |
? |
其实
? 有两个用途。
第一个用途上面提到了,用来匹配前面字符或分组 0 次或 1 次。 第二个用途,用在其他量词(比如 |
. |
. 匹配除了
"\n" 外的任何字符。
想要匹配 |
(pattern) |
(pattern) 匹配模式
pattern 并捕获结果。
|
(?:pattern) |
(?:pattern) 匹配模式
pattern 并但不捕获结果。
加 |
(?=pattern) |
(?=pattern) 零宽正向预测先行断言。断言此位置的后面匹配
pattern ,不捕获结果(零宽)。
先行断言 |
(?!pattern) |
(?!pattern) 零宽负向预测先行断言,断言此位置的后面不匹配
pattern ,不捕获结果(零宽)。
先行断言 |
x|y |
x|y 匹配
x 或 匹配
y 。
比如 |
[xyz] |
[xyz] 代表一个字符集(字符集中的元字符不需要转义)。匹配任何出现在中括号
[ ] 中的字母 。
比如 可以使用
|
[^xyz] |
[^xyz] 代表一个排除字符集,不匹配任何出现在中括号
[ ] 中的字母 。
比如 |
\b |
\b 匹配单词边界。
比如
|
\B |
\B 匹配非单词边界的位置。
比如
|
\cx |
\cx 匹配由
x 字符表示的控制字符。
如 /td> |
\d |
\d 匹配一个数字,相当于
[0-9] 。
|
\D |
\D 匹配一个非数字的字符,相当于
[^0-9] 。
|
\f |
\f 匹配一个换页符,相当于
\x0c 或
\cL 。
|
\n |
\n 匹配一个换行符,相当于
\x0a 或
\cJ 。
|
\r |
\r 匹配一个回车符,相当于
\x0d 或
\cM 。
|
\s |
\s 匹配空白字符,包括空格
" " 、制表符
"\t" 、翻页符
"\f" 、换行符
"\n" 、垂直制表符
"\t" 。
相当于 |
\S |
\S 匹配非空白字符,相当于
[\f\n\r\t\v]
|
\t |
\t 匹配制表符,相当于
\x09 、
\cI 。
|
\v |
\v 匹配垂直制表符,相当于
\x0b 、
\cK 。
|
\w |
\w 匹配任何单词字符,包括下划线,相当于
[A-Za-z0-9_] 。
|
\W |
\w 匹配任何非单词字符,相当于
[^A-Za-z0-9_] 。
|
\xn |
\xn 匹配 Latin-1 字符,其中的
n 为
16 位的数字。 。
所有的 ASCII 字符都可以用 |
\num |
\num 引用前面第
num 个
捕获子表达式 捕获到的字符串。
num 是一个正整数。
如 (.)\1 同一个字符匹配两次。 |
\n |
\n
n 代表一个数字。
|
\nm |
\nm
n 、
m 代表一个数字。
|
\nml |
\nmlnm 当 n 在
0 - 3 间,
m 、
l 在
0 - 7 间, 匹配八进制转义码
nml 。
|
\un |
\un 匹配编码为
n 的 Unicode 字符 。
|