因为最近和正则表达式打交道的比较多,所以急需一份常用的好用的正则表达式列表方便参考。在网上搜了搜,找到一份比较全的,并做了简单整理和部分验证,以备不时之需。没有全部验证(后续会不断更正),可能会存在部分错误,所以还请自己根据需要进行更正。
啰嗦一句:我认为正则匹配的核心就是,知道你要找什么(首先一步确定查找的格式)、知道找的方法(了解正则表达式中的各种字符及其含义)、知道什么不该找(现实情况中很可能会出现误报的情况,这不是正则写错了,而是因为一开始没有了解什么样的内容是不应被匹配到的)、然后就是“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==
参考链接:
- RegEx – Xojo Documentation
- 常用的正则表达式
- 常用的正则表达式全面总结
- A Regular Expression Primer
- [译]另类的密码破解速查表
- Unicode汉字范围[bak]
- http://stackoverflow.com/questions/427979/how-do-you-extract-ip-addresses-from-files-using-a-regex-in-a-linux-shell
- http://stackoverflow.com/questions/11482951/extracting-ip-address-from-a-line-from-ifconfig-output-with-grep
- http://stackoverflow.com/questions/11264005/using-a-regex-to-match-ip-addresses-in-python
- http://stackoverflow.com/questions/5284147/validating-ipv4-addresses-with-regexp
- http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
- http://www.regexmagic.com/manual/xmppatternipv4.html
- http://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address
- http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address
- http://stackoverflow.com/questions/161738/what-is-the-best-regular-expression-to-check-if-a-string-is-a-valid-url
==
搜索关键字:
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 条评论
理解 Java 正则表达式怪异的 \\ 和 \\\\,让您见怪不怪
https://unmi.cc/understand-java-regex-backslash/
http://www.cnblogs.com/hqbhonker/p/7517394.html
`
复杂的用法不说,且说 Java 的正则表达式在匹配点(.) 和斜杠(\),表达式要分别写作 \\. 和 \\\\,难看些,不好理解。幸好还有些人记住了,匹配点(.) 或 {、[、(、?、$、^ 和 * 这些特殊符号要要前加双斜框,匹配 \ 时要用四斜杠,这确实能让你包走天涯的。那么为什么是这样呢,不是一个斜杠、三个或更多呢,所以知其然还要知其所以然,这样才能每次心中有数,方能以一变应万变。
Java 的正则表达式字符串有两层次的意义,那就是 Java 字符串转义出符合正则表达式语法的字符串,“\\.”, 转义后交给正则表达式的就是 “\.”,这是符合传统的。因为我们平时字符串转义后直接用于输出,所以带来不少误解,这里的最终的正则表达式就是 Java 字符串的输出。
只要记住一点,你要想的正则表达式字符串是什么,而正则表达式字符串就是 Java 字符串的的输出结果,你就知道应该怎么写了。
`
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 进行优雅降级。
`
身份证号码的正则表达式及验证详解(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;
}
`
使用Python随机生成身份证号码及校验
https://github.com/jayknoxqu/id-number-util
https://www.jianshu.com/p/b744d9d17f8f
regexp正则表达式:提取目标内容
http://zhouchen.tech/2018/09/06/regexp%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9A%E6%8F%90%E5%8F%96%E7%9B%AE%E6%A0%87%E5%86%85%E5%AE%B9/
匹配中文字符的正则表达式: [A-Za-z0-9 \\u4e00-\\u9fa5]
http://www.xuetimes.com/archives/770
Hive 正则表达式使用 与 匹配中文
https://www.maiyewang.com/?p=14532
匹配身份证号和手机号的正则表达式
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}
`
一文全面了解IPv6!
https://mp.weixin.qq.com/s/Lr1VR-gCjmcMJXoADBG_hA
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”);
`
java 从字符串中提取省、市、区、镇、乡等区域名称(包含少数民族地区)
https://blog.csdn.net/qq_40083897/article/details/83048587
用正则表达式切割详细地址中的省、市、区
https://blog.csdn.net/qq_38584262/article/details/86302509
JAVA实现地址解析功能
https://blog.csdn.net/renfng/article/details/94738164
中国各省份城市列表
http://www.maps7.com/china_province.php