JavaScript 正则表达式
一、概念
正则表达式是用于匹配字符串中字符组合的模式。
1 | var expression = / pattern / flag; |
二、种类
1、简单字符
字符本身
1 | /hello/g |
2、方括号
用[]
指代一个字符,里面的字符表示这个字符的选择范围
1)范围类
-
表示一个范围内的字符
1 | [0-9] <=> [0123456789] |
2)组合类
范围类的组合
1 | [0-9a-fA-F] // 十六进制 |
3)负向类
表示不在方括号之间的任何字符
1 | [^0-9] |
3、量词
表示前面字符出现的次数。
贪婪量词: 找到匹配的最大串,找到最后才停止
惰性量词: 找到匹配的最小串,找到就停止
贪婪量词 | 惰性量词 | 描述 |
---|---|---|
{0, 1} 或 ? | ?? | 至少 0 次,至多 1 次 |
{0, } 或 * | *? | 至少 0 次 |
{1, } 或 + | +? | 至少 1 次 |
{n} | {n}? | 出现n次 |
{n, m} | {m, n}? | 至少 n 次,至多 m 次 |
{n, } | {m, }? | 至少 n 次,至多不限 |
1 | /[0-9]{4}/g |
4、通配符
类别 | 描述 |
---|---|
. | [^\n\r],除了回车换行以外,都可以匹配。 |
\d | [0-9],数字 |
\D | [^0-9],非数字 |
\w | [a-zA-Z_0-9],数字字母下划线 |
\W | [^a-zA-Z_0-9],非数字字母下划线 |
\s | [\t\n\x0B\f\r],空格或者空白 |
\S | 非空格或者非空白 |
\b | 表示边界(两个字符中间的位置)一边是\w,另一边是\W |
\B | 不是边界 |
^ | 表示开始 |
$ | 表示结束 |
5、分组
一个正则表达式,不但可以对整个匹配进行操作,还可以对其中()
中的子串进行匹配,即分组。
1)(pattern) 匹配 pattern 同时捕获结果,自动设定好组。
1 | \1 |
2)(?\
1 | \k\<name> // 反向引用 |
例:
1 | var str = 'word excel excel hello world world!'; |
6、零宽(负向)先行\后行断言
开头是:(?<=什么) 开头不是:(?<!=什么)
结尾是:(?=什么) 结尾不是:(?!=什么)
1 | str = 'r;e;a;a;a;rcaaa=bbb=;'; |
7、|(或)
1 | str = 'var aaadf1;'; |
三、创建方式
1、正则表达式字面量
1 | var pattern = /[bc]at/i; |
2、正则表达式类 RegExp
1 | var pattern = new RegExp("[bc]at", "i"); |
正则表达式字面量始终共享同一个 RegExp 实例,构造函数创建的每一个新的 RegExp 实例都是一个新实例。
RegExp 构造函数上有一些属性,并且这些属性跟着执行的最后一次正则表达式操作而变化。
1 | var text = 'this has been a short summer'; |
RegExp.\$1,…RegExp.$9,存储捕获的组。
1)RegExp 实例属性
通过 global、ignoreCase、multiline、lastIndex、source 这几个属性获取一个正则表达式相关的信息。
四、使用
1、RegExp 实例方法
1)test(string)
表示当前正则是否匹配指定的字符串,返回布尔值。
1 | var regExp = new RegExp('[0-9]+','g'); |
在指向知道目标字符串和某个模式是否匹配,但不需要知道其文本内容的情况下使用。
2)exce(string)
表示当前正则是否匹配指定的字符串,返回匹配的数组(找不到返回null)
备注:该方法是为捕获组而专门设计的,该方法接收应用模式的字符串,返回一个数组且额外带有index,input属性。index 表示匹配项在字符串中的位置;input 是应用正则表达式的字符串。且数组第一项是和模式匹配的整个字符串;其他项是和模式中捕获的组匹配的字符串。
1 | var test = "mom and dad and baby"; |
模式中设置 g:在同一字符串上多次调用 exec() 始终返回第一个匹配项的信息。
模式中不设置 g:在同一字符串上多次调用 exec() 会在字符串中继续查找新的匹配项
1 | var text = 'cat, bat, sat, fat'; |
2、String 支持的正则函数
1)match(regexp):返回数组
1 | str.match(/[0-9]+/g); |
没有g,第一个匹配的最大串,其他是分组的子串,index:最大串开始的位置, input原始的串
有g,返回数组,所有匹配的最大串,但是没有分组的子串,index和input无效。
2)replace(regexp/substr, replacement):返回字符串
regexp 表示正则表达式。
substr表示子串。
replacement 表示替换进去的串,或者函数。\$1 ~ $99 分组,\$&代表子串; \$` 子串左侧; \$’ 子串右侧。
1 | // 把小写的 word 变成大写的 WORD |
1 | // 匹配 单词1-单词2 模式,然后变成单词2-单词1 |
3)search(regExp)
直接量和对象,返回整数,开始的位置,-1表示没有找到。
1 | str = 'I word site excel word OK chrome match OK excel word'; |
注意:search 不支持全局,忽略参数 g,同时忽略 regexp 的 lastIndex
4)split(separator, howmany)
把一个字符串分隔成数组。separator 正则,字符串,可选;howmany 是最大长度。
1 | var str = 'a,b.c' |
五、练习
1、如何将浮点数点左边的数每三位添加一个逗号,如 12005009.11 转化为 12,005,009.11
1 | function commafy(num) { |