正则表达式

作者 Joan 发布时间 April 11, 2017

特殊字符

字符 含义
^ 输入的开始
$ 输入的结束
* 匹配前一个表达式0次或多次
+ 匹配前面一个表达式1次或者多次
? 匹配前面一个表达式0次或者1次
. 匹配除换行符之外的任何单个字符
\b 匹配一个词的边界
注意,一个匹配的词的边界并不包含在匹配的内容中
\d 匹配一个数字
\s 匹配一个空白字符,包括空格、制表符、换页符和换行符
\w 匹配一个单字字符(字母、数字或者下划线)
等价于[A-Za-z0-9_]
(x) 匹配 ‘x’ 并且记住匹配项
(?:x) 匹配 ‘x’ 但是不记住匹配项
这种叫作非捕获括号
使得你能够定义为与正则表达式运算符一起使用的子表达式
x(?=y) 匹配’x’仅仅当’x’后面跟着’y’,这种叫做正向肯定查找
x(?!y) 匹配’x’仅仅当’x’后面不跟着’y’,这个叫做正向否定查找
x|y 匹配‘x’或者‘y’
{n,m} 匹配前面的字符至少n次,最多m次
[xyz] 一个字符集合
对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义
标志 描述
g 全局搜索
i 不区分大小写搜索
m 多行搜索
y 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志

正则表达式实例


  • 检查用户名和密码是否符合要求
    //用户名:中文、字母、数字、‘-’、‘_’,4到20个字符
    /^[\u4e00-\u9fa5A-Za-z0-9-_]{4,20}$/.test(username);
    //密码:字母、数字、下划线,6到20个字符
    /^\w{6,20}$/.test(password);
    

    中文的正则表达式是[\u4e00-\u9fa5],需要注意的是中文占两个字符。


  • 检查字符串是否含有相邻的相同单词(例如’foo foo bar’,输出’true’)
    /(\b\w+\b)\s+\1/.test('foo bar foo');
    //结果 false
    

    正则表达式(x)匹配 ‘x’ 并且记住匹配项。


  • 输入一串数字,从低位开始,每三位添加一个逗号(例如输入10000,10,000)
    '12334565632'.replace(/(\d)(?=(\d{3})+$)/g, "$1,");
    //结果:"12,334,565,632"
    

    正则表达式x(?=y)在MDN中对此的解释为:匹配’x’仅仅当’x’后面跟着’y’,这种叫做正向肯定查找。对于上述表达式,x(\d)y代表(?=(\d{3})+$)。翻译过来就是查找并记住一个数字,这个数字后面跟着数字数量为3的倍数,最后在符合条件的数字后面加逗号。如果直接写为/(\d){3}/g,该表达式就会从前往后寻找3个3个的数字。


  • 删除数组重复项
    var names = ['Joan','Tina','Tom','Joan','Honey','Tom','Tom','Kitty'];
    var str = names.join(',');
    var re = /(\b\w+\b,?)(?=.*\1)/g;
    str = str.replace(re, '');
    str.split(',');