正则表达式的判断

Fenger Lv3

正则表达式(Java)

  • 身份证

    定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)

    1
    2
    3
    String regularExpression = 
    "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|"+
    "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";

    假设18位身份证号码:41000119910101123X 410001 19910101 123X

    ^ 开头
    [1-9] 第一位1-9中的一个4
    \d{5} 五位数字 10001(前六位省市县地区)
    (18|19|20) 19(现阶段可能取值范围18xx-20xx年)
    \d{2} 91(年份)
    ((0[1-9])|(10|11|12)) 01(月份)
    (([0-2][1-9])|10|20|30|31) 01(日期)
    \d{3} 三位数字 123(第十七位奇数代表男,偶数代表女)
    [0-9Xx] 0123456789Xx其中的一个 X(第十八位为校验值)
    $ 结尾

    完整Java代码(包含第18位验证)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    String str = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|";
    boolean isMatched = false;
    if (StringUtils.isNotBlank(str)){
    Pattern p = Pattern.compile(cardno);
    Matcher m = p.matcher(str);
    if (m.matches()) {
    if (str.length() == 18) {
    try {
    char[] charArray = str.toCharArray();
    //前十七位加权因子
    int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    //这是除以11后,可能产生的11位余数对应的验证码
    String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
    int sum = 0;
    for (int i = 0; i < idCardWi.length; i++) {
    int current = Integer.parseInt(String.valueOf(charArray[i]));
    int count = current * idCardWi[i];
    sum += count;
    }
    char idCardLast = charArray[17];
    int idCardMod = sum % 11;
    if (idCardY[idCardMod].toUpperCase().equals(String.valueOf(idCardLast).toUpperCase())) {
    isMatched = true;
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
    return isMatched;
  • 手机号

    持续更新

    https://github.com/VincentSit/ChinaMobilePhoneNumberRegex/blob/master/README-CN.md

    1
    String phone="^(?:\\+?86)?1(?:3\\d{3}|5[^4\\D]\\d{2}|8\\d{3}|7(?:[01356789]\\d{2}|4(?:0\\d|1[0-2]|9\\d))|9[01356789]\\d{2}|6[2567]\\d{2}|4(?:[14]0\\d{3}|[68]\\d{4}|[579]\\d{2}))\\d{6}$";
    1
    2
    3
    4
    5
    6
    7
    8
    	String str="^(?:\\+?86)?1(?:3\\d{3}|5[^4\\D]\\d{2}|8\\d{3}|7(?:[01356789]\\d{2}|4(?:0\\d|1[0-2]|9\\d))|9[01356789]\\d{2}|6[2567]\\d{2}|4(?:[14]0\\d{3}|[68]\\d{4}|[579]\\d{2}))\\d{6}$";
    boolean isMatched = false;
    if(StringUtils.isNotBlank(phone)){
    Pattern p = Pattern.compile(phone);
    Matcher m = p.matcher(str);
    isMatched = m.matches();
    }
    return isMatched;
  • 电子邮箱

    1
    String email = "^([a-z0-9A-Z]+[-|.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";

    正则表达式有待测试

    完整代码类比手机号。

  • 全角字符正则表达式

    1
    [^\u0000-\u00FF\uFF61-\uFF9F\uFFE8-\uFFEE]

附录 :正则表达式语法

. - 除换行符以外的所有字符。
^ - 字符串开头。
$ - 字符串结尾。
\d,\w,\s - 匹配数字、字符、空格。
\D,\W,\S - 匹配非数字、非字符、非空格。
[abc] - 匹配 a、b 或 c 中的一个字母。
[a-z] - 匹配 a 到 z 中的一个字母。
[^abc] - 匹配除了 a、b 或 c 中的其他字母。
aa|bb - 匹配 aa 或 bb。
? - 0 次或 1 次匹配。
*-匹配 0 次或多次。
+- 匹配 1 次或多次。
{n} - 匹配 n次。
{n,} - 匹配 n次以上。
{m,n} - 最少 m 次,最多 n 次匹配。
(expr) - 捕获 expr 子模式,以 \1 使用它。
(?:expr) - 忽略捕获的子模式。
(?=expr) - 正向预查模式 expr。
(?!expr) - 负向预查模式 expr。

  • 标题: 正则表达式的判断
  • 作者: Fenger
  • 创建于 : 2020-11-28 00:00:00
  • 更新于 : 2023-11-14 14:25:31
  • 链接: https://www.fenger.net.cn/2020/11/28/regular_expression(Java)/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
此页目录
正则表达式的判断