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