https://regex101.com/

开始与结束

^ $ 匹配的是一个位置 而不是字符

转义

\ 匹配转义字符本身
$ 匹配$这个字符

正则对象的方法

RegExp.test()
RegExp.exec()
String.match()
如果字符串匹配到了表达式,会返回一个数组,数组的第一项是进行匹配完整的字符串,之后的项是用圆括号捕获的结果。如果没有匹配到,返回null

元字符 字符集合

\d 匹配一个数字
\w word 匹配一个字母或一个数字或者一个下划线
\s space 一个空格符:包括空格,制表符和换行符。
. 匹配换行符\n之外的任意单个字符

\b 单词边界 - 匹配的也是一个位置

  1. '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/;

捕获组

使用圆括号

反向引用

正则内捕获

  1. '<App>hello regex</App>'.match(/<([a-zA-Z]+)>.*<\/\1>/);
  2. // ["<App>hello regex</App>", "App", index: 0, input: "<App>hello regex</App>", groups: undefined]

正则外捕获

1

  1. '@abc'.match(/@(abc)/);
  2. // ["@abc", "abc", index: 0, input: "@abc", groups: undefined]
  3. RegExp.$1;
  4. // "abc"

2

  1. 'hello **regex**'.replace(/\*{2}(.*)\*{2}/, '<strong>$1</strong>');
  2. // "hello <strong>regex</strong>"
  3. 正则捕获的引用,它就是replace方法

零宽断言

正则还有一些比较高级的匹配位置的语法,它匹配的是:在这个位置之前或之后应该有什么内容。
零宽(zero-width)是什么意思?指的就是它匹配一个位置,本身没有宽度。

零宽肯定先行断言

  1. 'CoffeeScript JavaScript javascript'.match(/\b\w{4}(?=Script\b)/);

零宽肯定后行断言 ?<=标识。

  1. '演员高圆圆 将军霍去病 演员霍思燕'.match(/(?<=演员)霍\S+/);

修饰符

g

  1. g修饰符会开启全局匹配模式,找到所有匹配的结果。
  2. 默认情况下,正则从左向右匹配,只要匹配到了结果就会收工。

例子

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+)*$/

参考

一次搞定正则