各符号含义
符号 | 含义 |
---|---|
* | 零到多次 |
+ | 一到多次 |
? | 零次或者一次 |
. | 除了\n以外的任意字符 |
{n} | 出现 n 次 |
{n,} | 出现 n 到多次 |
{n,m} | 出现 n 到 m 次 |
\d | 匹配一个数字,等价于[0-9] |
\D | 大写D匹配一个非数字字符,等价于[^0-9] |
\w | 匹配字母、数字或者下划线,等价于[A-Za-z0-9] |
\W | 大写W表示非字母且数字,与\w相反,等价于[^a-zA-Z0-9] |
\s | 小写s表示匹配一个空字符,包括空格,换行,回车,tab,等价于[\n\r\t\f] |
\S | 大写S匹配非空格字符,与\s相反,等价于[^\n\r\t\f] |
[] | 中括号用来表示一个字符集合,^ 在[] 中表示匹配任何不在该集合中的字符 |
{} | 大括号的作用是指重复前面一个字符多少遍,例{N}:重复n遍;{n,m}:重复n~m遍;{n, }:至少重复n遍;{,m}:最多重复m遍 |
() [] {}的区别
符号 | 含义 |
---|---|
() | ()的作用是提取匹配的字符串。表达式中有几个()就会得到几个相应的匹配字符串。比如(\s+)表示连续空格的字符串 |
[] | []是定义匹配的字符范围。比如[a-zA-Z0-9]表示字符文本要匹配英文字符和数字 |
{} | {}一般用来表示匹配的长度,比如\d{3}表示匹配三个数字,\d{1,3}表示匹配1~3个数字,\d{3,}表示匹配3个以上数字 |
关于空格
符号 | 含义 |
---|---|
\s | 空格 |
\uFEFF | ES5新增的空白符,叫字节次序标记字符(Byte Order Mark) ,也就是BOM |
\xA0 | 禁止自动换行空白符,相当于html中的 |
“”,”\x20”,”\u0020” | 半角空格符,键盘空格键 |
“\t”,”\x09”,”\u0009” | 制表符,键盘tab键 |
“\v”,”\x0B”,”\u000B” | 垂直制表符 |
“\f”,”\x0C”,”\u000C” | 换页符 |
“\r”,”\x0D”,”\u000D” | 回车符 |
“\n”,”\x0A”,”\u000A” | 换行符 |
对于IE低版本,\s
等价于[\t\v\f\r\n]
例子:
trim的polyfill
if(!String.prototype.trim) {
String.prototype.trim = function() {
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,'');
};
}
解析:
[]
表示范围^
表示行的开头,$
表示行的结束-
修饰符
i:忽略大小写
- g:全局模式
- m:多行模式,表示查找到一行文本末尾时会继续查找
- y:黏附模式,表示只查找从 lastIndex 开始及之后的字符串
- u:Unicode 模式,启用 Unicode 匹配
- s:dotAll 模式,表示元字符 . 匹配任何字符(包括 \n 或 \r)
元字符
( [ { \ ^ $ | ) ] } ? * + .
属性
- flags:返回正则表达式的修饰符。
- sticky:表示是否设置了y修饰符。
- unicode:表示是否设置了u修饰符。
- global:布尔值,表示是否设置了g修饰符。
- ignoreCase:布尔值,表示是否设置了i标志。
- lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起。
- multiline:布尔值,表示是否设置了m标志。
- source:正则表达式的字符串表示。
方法
exec
用于配合捕获组使用,这个方法只接收一个参数,即要应用模式的字符串。
返回值:
如果找到了匹配项,则返回包含第一个匹配信息的数组;如果没找到匹配项,则返回 null 。返回的数组虽然是 Array 的实例,但包含两个额外的属性:index 和 input 。index 是字符串中匹配模式的起始位置, input 是要查找的字符串。这个数组的第一个元素是匹配整个模式的字符串,其他元素是表达式中的捕获组匹配的字符串。如果模式中 没有捕获组,则数组只包含一个元素。test
接收一个字符串参数。如果输入的文本与模式匹配,则返回 true ,否则返回 false 。断言
先行断言
x
只有在y
前面才匹配,必须写成/x(?=y)/
。
先行否定断言
x
只有不在y
前面才匹配,必须写成/x(?!y)/
。
后行断言
x
只有在y
后面才匹配,必须写成/(?<=y)x/
。
后行否定断言
x
只有不在y
后面才匹配,必须写成/(?<!y)x/
。
具名组匹配
允许为每一个组匹配指定一个名字,既便于阅读代码,又便于引用。
“具名组匹配”在圆括号内部,模式的头部天剑“问号+尖括号+组名”(?<year>
),然后就可以在exec
方法返回结果的groups
属性上引用该组名。
字符串替换时,使用$<组名>
引用具名组。
let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
'2015-01-02'.replace(re, '$<day>/$<month>/$<year>')
// '02/01/2015'