常见问题及解决方案原创
正则常见问题及解决方案
解决思路
- 将一个问题拆分为多个小问题
- 针对小问题见招拆招
- 若某个位置可能有多个字符,使用字符组
- 若某个位置可能有多个字符串,使用多选结构
- 若出现的次数不确定,使用量词即可
- 若对位置有要求,使用锚点锁定位置
- 若某些字符不能出现,通过字符组脱字符来排除
- 若某些字符串不能出现,可以使用环视来限制
常见问题及解决方案
- 匹配数字
- \d 和 [0-9]
- 匹配正数,负数,小数
- [+-]?\d+(.\d+)?
- 匹配浮点数
- 带符号时,浮点数为正,则整数部分可省略
- 带符号时,浮点数为负,则整数部分不可省略
- 不带符号,浮点数整数部分可省略
- 综合以上情况,可能有多个字符串,使用多选结构
- +\d*(.\d+)|-\d+(?:.\d+)|.\d+
- 匹配十六进制
- 匹配手机号
- 匹配身份证号
- 身份证号第一代为15位,第二代为18位且最后一位可能是X/x
- [1-9]\d{14}(\d\d[0-9Xx])?
- 匹配邮政编码
- 一般为6位数字,且应该单独出现,而不是作为其他字符串的一部分,如身份证的一部分。因此使用断言
- (?<!\d)\d{6}(?!\d)
- 匹配QQ号码
- 不能以0开头,最短为5位,最长到10位
- [1-9]\d{4,9}
- 匹配中文字符
- 中文字符属于多字节Unicode字符,必须使用-u来编码
- [\u4E00-\u9FFF]
- 匹配IPv4地址
- \d{1,3}(.\d{1,3}){3}
- 也可以针对每位数字进行精确控制
- 正则不是唯一的方法,也应该尽量少使用正则,如果只是验证格式是否合法,完全可以使用点号切割
- 匹配日期和时间
- 假设日期格式——> yyyy-mm-dd
- \d{4}-\d{2}-\d{2}
- 假设时间格式——> hh:mm:ss
- (?:2[0-3]|1\d|0?\d)(😦?:[1-5]\d|0\d)){1,2}
- 匹配邮箱
- 格式——>用户名@主机名,用户名可以是字母数字下划线点号
- [0-9a-zA-Z_.+-]+@[0-9a-zA-Z-]+.[0-9a-zA-Z-.]+
- 匹配网页标签
- <((\w+)\s*(\w*))>(?.)*</($1)>