JavaScript 正则表达式
正则表达式是由一个字符序列形成的搜索模式。
正则表达式可以是一个简单的字符,或一个更复杂的模式。可用于所有文本搜索和文本替换的操作。
语法:/正则表达式主体/修饰符(可选)
var patt = /runoob/i
//其中runoob 是一个正则表达式主体 (用于检索)、i 是一个修饰符 (搜索不区分大小写)。
正则表达式模式
- 方括号用于查找某个范围内的字符:
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符。 |
[0-9] | 查找任何从 0 至 9 的数字。 |
(x|y) | 查找任何以 | 分隔的选项。 |
- 元字符是拥有特殊含义的字符:
元字符 | 描述 |
---|---|
\d | 查找数字。 |
\s | 查找空白字符。 |
\b | 匹配单词边界。 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。 |
- 量词:
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串。 |
n* | 匹配任何包含零个或多个 n 的字符串。 |
n? | 匹配任何包含零个或一个 n 的字符串。 |
正则表达式修饰符
正则表达式有六个可选参数 允许全局和不分大小写搜索等,既可以单独使用也能以任意顺序一起使用, 并且被包含在正则表达式实例中:
修饰符 可以在全局搜索中不区分大小写:
- 正则表达式标志
标志 | 描述 |
---|---|
g | 全局搜索。(查找所有匹配而非在找到第一个匹配后停止)。 |
i | 执行对大小写不敏感的匹配,不区分大小写搜索。 |
m | 多行搜索。 |
u | 使用unicode码的模式进行匹配。 |
s | 特殊字符原点.,其原点.匹配除了换行符\n以外的任何字符,加上s修饰符后,原点.中包含换行符\n。 |
y | 执行“粘性(sticky )”搜索,匹配从目标字符串的当前位置开始。 |
使用正则表达式的方法
在 JS 中,RegExp 对象是一个预定义了属性和方法的正则表达式对象。
常用的正则表达式的方法
- search() 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。在失败时返回-1。
- test() 用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
- replace() 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
- exec() 用于检索字符串中的正则表达式的匹配。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
例如:
search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
//使用正则表达式搜索 "Runoob" 字符串,且不区分大小写:
var str = "Visit Runoob!"; var n = str.search(/Runoob/i);
//输出结果为:
6
test() 方法 用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
//写法一:
var patt = /e/;
patt.test("The best things in life are free!");
//字符串中含有 "e",所以该实例输出为:
true
//写法二:
/e/.test("The best things in life are free!")
正则表达式中的特殊字符
\ | 反斜杠是转义字符。 如果前面加了 "\",它将不再匹配任何字符,而是表示一个字符边界。
|
^ | 区分大小写。 例: |
$ | 匹配输入的结束。
|
* | 匹配前一个表达式 0 次或多次。等价于
|
+ | 匹配前面一个表达式 1 次或者多次。等价于
|
? | 匹配前面一个表达式 0 次或者 1 次。等价于 例: 若紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。 例:对 "123abc" 使用 还用于先行断言中,如本表的 |
. | (小数点)默认匹配除换行符之外的任何单个字符。 例: 若 |
(x) | 它会匹配 'x' 并且记住匹配项。其中括号被称为捕获括号。 例: |
(?:x) | 匹配 'x' 但是不记住匹配项。这种括号叫作非捕获括号。 例: |
x(?=y) | 匹配'x'仅仅当'x'后面跟着'y',这种叫做先行断言。 例:/Jack(?=Sprat|Frost)/匹配‘Jack’仅当它后面跟着'Sprat'或者是‘Frost’。但‘Sprat’和‘Frost’都不是匹配结果的一部分。 |
(?<=y)x | 匹配'x'仅当'x'前面是'y',这种叫做后行断言。 例:/(?<=Jack|Tom)Sprat/匹配‘ Sprat ’仅仅当它前面是'Jack'或者是‘Tom’。但‘Jack’和‘Tom’都不是匹配结果的一部分。 |
x(?|y) | 仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找。 例:仅当这个数字后面没有跟小数点的时候,/\d+(?!\.)/ 匹配一个数字。 例:/\d+(?!\.)/.exec("3.141")匹配‘141’而不是‘3.141’ |
(?<!y)x | 仅当'x'前面不是'y'时匹配'x',这被称为反向否定查找。 例:仅当这个数字前面没有负号的时,
|
x|y | 匹配‘x’或者‘y’。 例:/green|red/匹配“green apple”中的‘green’和“red apple”中的‘red’ |
{n} | n 是一个正整数,匹配了前面一个字符刚好出现了 n 次。 例: /a{2}/ 不会匹配“candy”中的'a',但是会匹配“caandy”中所有的 a,以及“caaandy”中的前两个'a'。 |
{n,} | n是一个正整数,匹配前一个字符至少出现了n次。 例如, /a{2,}/ 匹配 "aa", "aaaa" 和 "aaaaa" 但是不匹配 "a"。 |
{n,m} | n 和 m 都是整数。匹配前面的字符至少n次,最多m次。 例:/a{1, 3}/ 并不匹配“cndy”中的任意字符,匹配“candy”中的a,匹配“caandy”中的前两个a,也匹配“caaaaaaandy”中的前三个a,但此时匹配的值是“aaa”,即使原始的字符串中有更多的a。 |
[xyz] | 一个字符集合。匹配方括号中的任意字符,包括转义序列。可用破折号(-)来指定一个字符范围。 例:[abcd] 和[a-d]是一样的,都匹配"brisket"中的‘b’,也都匹配“city”中的‘c’。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义,可不必进行转义,但若转义也是起作用的。 例:/[a-z.]+/ 和/[\w.]+/与字符串“test.i.ng”匹配。 |
[^xyz] | 一个反向字符集。匹配任何没有包含在方括号中的字符。可用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的。 例:[^abc] 和 [^a-c] 是一样的。他们匹配"brisket"中的‘r’,也匹配“chop”中的‘h’。 |
[\b] | 匹配一个退格(U+0008)。 |
\b | 匹配一个词的边界(一个词的边界就是一个词不被另外一个“字”字符(特定的字符集)跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。)。一个匹配的词的边界的内容的长度是0。 用"moon"举例: /\w\b\w/将不能匹配任何字符串,因为在一个单词中间的字符永远也不可能同时满足没有“字”字符跟随和有“字”字符跟随两种情况。 |
\B | 匹配一个非单词边界。 匹配如下几种情况: 字符串第一个字符为非“字”字符 字符串最后一个字符为非“字”字符 两个单词字符之间 两个非单词字符之间 空字符串 例:/\B../匹配"noonday"中的'oo', 而/y\B../匹配"possibly yesterday"中的’yes‘ |
\cX | 当X是处于A到Z之间的字符的时候,匹配字符串中的一个控制符。 例: |
\d | 匹配一个数字,等价于[0-9] 例: |
\D | 匹配一个非数字,等价于[^0-9] 例: |
\f | 匹配一个换页符 (U+000C)。 |
\n | 匹配一个换行符 (U+000A)。 |
\r | 匹配一个回车符 (U+000D)。 |
\s | 匹配一个空白字符,包括空格、制表符、换页符和换行符。 等价于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。 经官方测试,\s不匹配"\u180e",返回false。 例: |
\S | 匹配一个非空白字符。 等价于 例: |
\t | 匹配一个水平制表符 (U+0009)。 |
\v | 匹配一个垂直制表符 (U+000B)。 |
\w | 匹配一个单字字符(字母、数字或者下划线),等价于 例: |
\W | 匹配一个非单字字符。等价于 例: |
\n | 返回最后的第n个子捕获匹配的子字符串(捕获的数目以左括号计数)。 例: |
\0 | 匹配 NULL(U+0000)字符。不要在这后面跟其它小数,因为 \0<digits> 是一个八进制转义序列。 |
\xhh | 匹配一个两位十六进制数(\x00-\xFF)表示的字符。 |
\uhhhh | 匹配一个四位十六进制数表示的 UTF-16 代码单元。 |
\u{hhhh} | 或\u{hhhhh} (仅当设置了u标志时),匹配一个十六进制数表示的 Unicode 字符。 |