Skip to content

正则表达式

https://regex101.com/

开始与结束

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

转义

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

正则对象的方法

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

元字符 字符集合

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

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

javascript
'hello regex'.match(/\bregex$/); // ["regex", index: 6, input: "hello regex", groups: undefined]

大小写

\w\W
如果我们将大写和小写的带反斜杠的元字符组合在一起,就能匹配任何字符

修饰符i 忽略大小写

量词

量词只能重复紧贴在它前面的捕获组

{n} 重复n次
{n,} 重复n次或者多次

缩写

? 重复0次或者1次

+: 代表“一个或多个”,相当于 {1,}。

  • :代表着“零个或多个”,相当于

匹配多个模式

const regex = /yes|no|maybe/;

捕获组

使用圆括号

反向引用

正则内捕获

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

正则外捕获

1

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

2

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

零宽断言

正则还有一些比较高级的匹配位置的语法,它匹配的是:在这个位置之前或之后应该有什么内容。

零宽(zero-width)是什么意思?指的就是它匹配一个位置,本身没有宽度。

零宽肯定先行断言

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

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

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

修饰符

g

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

例子

email
var matcher = /.+@.+..+/;

密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符

/^[A-Za-z0-9]+$/

纯数字

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

参考

一次搞定正则

更新: 2019-07-15 11:56:37
原文: https://www.yuque.com/u3641/dxlfpu/tmlt9i