开始与结束
^ $ 匹配的是一个位置 而不是字符
转义
\ 匹配转义字符本身
$ 匹配$这个字符
正则对象的方法
RegExp.test()
RegExp.exec()
String.match()
如果字符串匹配到了表达式,会返回一个数组,数组的第一项是进行匹配完整的字符串,之后的项是用圆括号捕获的结果。如果没有匹配到,返回null
元字符 字符集合
\d 匹配一个数字
\w word 匹配一个字母或一个数字或者一个下划线
\s space 一个空格符:包括空格,制表符和换行符。
. 匹配换行符\n之外的任意单个字符
\b 单词边界 - 匹配的也是一个位置
'hello regex'.match(/\bregex$/); // ["regex", index: 6, input: "hello regex", groups: undefined]
大小写
\w\W
如果我们将大写和小写的带反斜杠的元字符组合在一起,就能匹配任何字符
修饰符i 忽略大小写
量词
量词只能重复紧贴在它前面的捕获组
{n} 重复n次
{n,} 重复n次或者多次
{n, m}
缩写
? 重复0次或者1次 {0,1}
+: 代表“一个或多个”,相当于 {1,}。
* :代表着“零个或多个”,相当于 {0,}
匹配多个模式
const regex = /yes|no|maybe/;
捕获组
使用圆括号
反向引用
正则内捕获
'<App>hello regex</App>'.match(/<([a-zA-Z]+)>.*<\/\1>/);
// ["<App>hello regex</App>", "App", index: 0, input: "<App>hello regex</App>", groups: undefined]
正则外捕获
1
'@abc'.match(/@(abc)/);
// ["@abc", "abc", index: 0, input: "@abc", groups: undefined]
RegExp.$1;
// "abc"
2
'hello **regex**'.replace(/\*{2}(.*)\*{2}/, '<strong>$1</strong>');
// "hello <strong>regex</strong>"
正则捕获的引用,它就是replace方法
零宽断言
正则还有一些比较高级的匹配位置的语法,它匹配的是:在这个位置之前或之后应该有什么内容。
零宽(zero-width)是什么意思?指的就是它匹配一个位置,本身没有宽度。
零宽肯定先行断言
'CoffeeScript JavaScript javascript'.match(/\b\w{4}(?=Script\b)/);
零宽肯定后行断言 ?<=标识。
'演员高圆圆 将军霍去病 演员霍思燕'.match(/(?<=演员)霍\S+/);
修饰符
g
g修饰符会开启全局匹配模式,找到所有匹配的结果。
默认情况下,正则从左向右匹配,只要匹配到了结果就会收工。
例子
email
var matcher = /.+@.+..+/;
密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
/^.(?=.{6,})(?=.\d)(?=.[A-Z])(?=.[a-z])(?=.[!@#$%^&? ]).*$/
数字和字母组成
/^[A-Za-z0-9]+$/
纯数字
/^\d{1,}$/
是否html标签
/<(.)>.<\/\1>|<(.*) \/>/
座机
/^0\d{2,3}-\d{7,8}$/
是否小数
/^\d+.\d+$/
账号是否合法 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线组合
/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/
纯中文
/^[\u4E00-\u9FA5]+$/
二代身份证
/^\d{6}(18|19|20)\d{2}(0\d|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$/
email地址
/^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$/