常用的正则表达式整理

本文最后更新于2015年3月28日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

因为最近和正则表达式打交道的比较多,所以急需一份常用的好用的正则表达式列表方便参考。在网上搜了搜,找到一份比较全的,并做了简单整理和部分验证,以备不时之需。没有全部验证(后续会不断更正),可能会存在部分错误,所以还请自己根据需要进行更正。

啰嗦一句:我认为正则匹配的核心就是,知道你要找什么(首先一步确定查找的格式)、知道找的方法(了解正则表达式中的各种字符及其含义)、知道什么不该找(现实情况中很可能会出现误报的情况,这不是正则写错了,而是因为一开始没有了解什么样的内容是不应被匹配到的)、然后就是“just try to search it”,慢慢调试,总会找到的!

==

匹配IPv4的地址(3种正则):

匹配域名:

匹配某一代码块中的内容:

匹配中文字符的正则表达式:

评注:匹配中文还真是个头疼的事,有了这个表达式就好办了(会漏掉少量标点符号以及一些不常用的中文字符,如果需要全的,参见最后的参考链接

匹配空白行的正则表达式:

评注:可以用来删除空白行

匹配HTML标记的正则表达式:

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:

评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:

评注:表单验证时很实用

匹配网址URL的正则表达式:

评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):

评注:表单验证时很实用

匹配国内固定电话号码:

评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:

评注:腾讯QQ号从10000开始

匹配中国邮政编码:

评注:中国邮政编码为6位数字

匹配身份证(不准确):

评注:中国的身份证为15位或18位

匹配特定数字:

评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:

评注:上面是最基本也是最常用的一些表达式

==Not the End==
参考链接:

==

搜索关键字:

site:stackoverflow.com regex match/email/mobile/card number/id number/

护照的正则表达式该怎么写?
搜索关键字:
  • 护照 正则表达式
护照号码的格式:

因私普通护照号码格式有: 14/15+7位数 G+8位数;

因公普通的是: P+7位数;

公务的是: S+7位数 或者 S+8位数 以D开头的是外交护照:D=diplomatic

参考链接:

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/2039.html

《常用的正则表达式整理》上有4条评论

  1. 理解 Java 正则表达式怪异的 \\ 和 \\\\,让您见怪不怪
    https://unmi.cc/understand-java-regex-backslash/
    http://www.cnblogs.com/hqbhonker/p/7517394.html

    复杂的用法不说,且说 Java 的正则表达式在匹配点(.) 和斜杠(\),表达式要分别写作 \\. 和 \\\\,难看些,不好理解。幸好还有些人记住了,匹配点(.) 或 {、[、(、?、$、^ 和 * 这些特殊符号要要前加双斜框,匹配 \ 时要用四斜杠,这确实能让你包走天涯的。那么为什么是这样呢,不是一个斜杠、三个或更多呢,所以知其然还要知其所以然,这样才能每次心中有数,方能以一变应万变。

    Java 的正则表达式字符串有两层次的意义,那就是 Java 字符串转义出符合正则表达式语法的字符串,“\\.”, 转义后交给正则表达式的就是 “\.”,这是符合传统的。因为我们平时字符串转义后直接用于输出,所以带来不少误解,这里的最终的正则表达式就是 Java 字符串的输出。

    只要记住一点,你要想的正则表达式字符串是什么,而正则表达式字符串就是 Java 字符串的的输出结果,你就知道应该怎么写了。

  2. JavaScript 正则表达式匹配汉字
    https://qianduan.group/posts/5a6ede120cf6b624d2239c8b
    https://jhuang.me/2018/01/26/JavaScript-%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8C%B9%E9%85%8D%E6%B1%89%E5%AD%97/

    /[\u4e00-\u9fa5]/是错的,不要用二十年前的正则表达式了
    /\p{Unified_Ideograph}/u是正确的,不需要维护,匹配所有汉字。这里\p是 Unicode 属性转义正则表达式。
    /\p{Ideographic}/u 和 /\p{Script=Han}/u 匹配了除了汉字以外的其他一些字符,在「汉字匹配正则表达式」这个需求下,是错的。
    目前只有 Chrome 支持 Unicode 属性转义正则表达式。对其他环境,使用 @babel/plugin-proposal-unicode-property-regex 和 regexpu-core 进行优雅降级。

  3. 身份证号码的正则表达式及验证详解(JavaScript,Regex)
    https://mp.weixin.qq.com/s/0Yohm5WXV8d94hX1DMUArw
    http://www.42du.cn/p/41

    var checkCode = function (val) {
    var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
    var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
    var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
    var code = val.substring(17);
    if(p.test(val)) {
    var sum = 0;
    for(var i=0;i<17;i++) {
    sum += val[i]*factor[i];
    }
    if(parity[sum % 11] == code.toUpperCase()) {
    return true;
    }
    }
    return false;
    }

    var checkDate = function (val) {
    var pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
    if(pattern.test(val)) {
    var year = val.substring(0, 4);
    var month = val.substring(4, 6);
    var date = val.substring(6, 8);
    var date2 = new Date(year+"-"+month+"-"+date);
    if(date2 && date2.getMonth() == (parseInt(month) - 1)) {
    return true;
    }
    }
    return false;
    }

发表评论

电子邮件地址不会被公开。 必填项已用*标注