常用的正则表达式整理


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

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

==

匹配IPv4的地址(3种正则):
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}
([0-9]{1,3}\.){3}[0-9]{1,3}
(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
匹配域名:
^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$
匹配某一代码块中的内容:
\{[^{]+?[^}]\}
匹配中文字符的正则表达式:
[\u4e00-\u9fa5]

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

匹配空白行的正则表达式:
^\s*$

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

匹配HTML标记的正则表达式:
<(\S*?)[^>]*>.*?</1>|<.*? />

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

匹配首尾空白字符的正则表达式:
^\s*|\s*$

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

匹配Email地址的正则表达式:
\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*
[^0-9a-z][0-9a-z_.]+@[0-9a-z]+\.(com|cn|me|org|net|ru|jp)

评注:表单验证时很实用

匹配网址URL的正则表达式:
[a-zA-z]+://[^\s]*

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

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$

评注:表单验证时很实用

匹配国内固定电话号码:
\d{3}-\d{8}|\d{4}-\d{7}

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

匹配腾讯QQ号:
[1-9][0-9]{4,}

评注:腾讯QQ号从10000开始

匹配中国邮政编码:
[1-9]\d{5}(?!\d)

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

匹配身份证(不准确):
\d{15}|\d{18}

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

匹配特定数字:
^[1-9]*$    //匹配正整数
^-[1-9]*$   //匹配负整数
^-?[1-9]*$   //匹配整数
^[1-9]*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]*|0$   //匹配非正整数(负整数 + 0)
^[1-9]*.*|0.*[1-9]*$   //匹配正浮点数
^-([1-9]*.*|0.*[1-9]*)$  //匹配负浮点数
^-?([1-9]*.*|0.*[1-9]*|0?.0+|0)$  //匹配浮点数
^[1-9]*.*|0.*[1-9]*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]*.*|0.*[1-9]*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)

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

匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$    //匹配由26个英文字母的大写组成的字符串
^[a-z]+$    //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$    //匹配由数字、26个英文字母或者下划线组成的字符串

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

==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

^1[45][0-9]{7}|G[0-9]{8}|P[0-9]{7}|S[0-9]{7,8}|D[0-9]+$
^(?:P\d{7}|G\d{8}|S\d{7,8}|D\d+|1[45]\d{7})$
参考链接:
,

《 “常用的正则表达式整理” 》 有 9 条评论

  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;
    }
    `

  4. 匹配身份证号和手机号的正则表达式
    http://1778.com/xh/
    `
    # 身份证号默认以18位进行验证,出生日期用1900 – 2019

    # 10
    [1-9][0-9]{5}(19[0-9]{2}|20[0-2][0-9])
    # 7
    [0-9]{7}
    # 1
    [0-9X]
    # 身份证号
    [1-9][0-9]{5}(19[0-9]{2}|20[0-2][0-9])[0-9]{7}[0-9X]

    # 手机号
    1[3-9][0-9]{9}
    `

  5. java从地址串中解析提取省市区-完美匹配中国所有地址
    https://blog.csdn.net/superSubfn/article/details/80290491
    `
    String regex=”(?[^省]+自治区|.*?省|.*?行政区|.*?市)(?[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?[^区]+区|.+镇)?(?.*)”;

    province = m.group(“province”);
    city = m.group(“city”);
    county = m.group(“county”);
    town = m.group(“town”);
    village = m.group(“village”);
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注