Java-18位身份证号的正则表达式。帮忙拆一下代码。 正则表达式判断18位身份证,该怎么处理

作者&投稿:霍筠 (若有异议请与网页底部的电邮联系)
代码如下:```String idNumberRegex = \"^[1-9]\\\\d{5}(19|20)\\\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\\\d|3[01])\\\\d{3}[0-9Xx]$\";```这是用来匹配中国大陆公民身份证号码的正则表达式,其中:- `^` 匹配字符串的开始位置。- `[1-9]` 匹配第一位,取值为 1-9。- `\\\\d{5}` 匹配前六位,也就是地区码,由 6 位数字组成。- `(19|20)\\\\d{2}` 匹配出生年份,取值为 1900-2099 年。- `(0[1-9]|1[012])` 匹配出生月份,取值为 01-12 月。- `(0[1-9]|[12]\\\\d|3[01])` 匹配出生日期,取值为 01-31 日。- `\\\\d{3}` 匹配后三位,也就是顺序码,由 3 位数字组成。表示出生日期同一天出生的人填不同的数字,号码使用 000。- `[0-9Xx]` 匹配最后一位,取值为 0-9, X, x。其中 X 表示为 10,x 表示为 10 次方。其中正则表达式中出现的 `\\\\` 是为了转义 `\\`,因为 `\\` 在 Java 中要用 `\\\\` 表示。

^ 匹配字符串的开始
[1-9] 第1位:1-9
\d{5} 第2-6位:0-9
[1-9] 第7位:1-9
\d{3} 第8-10位:0-9
((0\d)|(1[0-2])):
第11-12位:(00-09)或(10-12)
(([0|1|2]\d)|3[0-1])
第13-14位:(00-29)或(30-31)
\d{3} 第15-17位:0-9
([0-9]|X)
第18位:0-9或X
$ 匹配字符串的结束

自问自答?

java用正则表达式判断一个18位身份证号是否有效~

很显然 是你得正则表达式不对啊,正确的18位身份证验证正则为:
String regex = "^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";而且就算正则表达式正确了,你的逻辑判断代码也是有问题,

完成代码如下,请参考:
public class Homework {public static void main(String[] args) {String regex = "^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";System.out.println("请输入18位的身份证号码:");Scanner scanner = new Scanner(System.in);String s = scanner.nextLine();if (s.matches(regex)) {int y1, y2;String year1 = s.substring(6, 8);y1 = Integer.parseInt(year1);String year2 = s.substring(8, 10);y2 = Integer.parseInt(year2);if ((y1 == 18 && y2 >= 87 && y2 = 0 && y2 <= 99)|| (y1 == 20 && y2 <= 17)) {int m, d;String month = s.substring(10, 12);m = Integer.parseInt(month);String day = s.substring(12, 14);d = Integer.parseInt(day);if ((m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)&& (d == 31))System.out.println("有效");else if ((m == 4 || m == 6 || m == 9 || m == 11) && (d == 30))System.out.println("有效");else if (m == 2) {int y;String year = s.substring(6, 10);y = Integer.parseInt(year);if (((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)&& (d == 29))System.out.println("有效");else if (((y % 4 != 0 && y % 100 == 0) || y % 400 != 0)&& (d == 28))System.out.println("有效");elseSystem.out.println("无效");return;} else {System.out.println("无效");return;}int ss;String sex = s.substring(16, 17);ss = Integer.parseInt(sex);if (ss % 2 == 0)System.out.println("女性");elseSystem.out.println("男性");} elseSystem.out.println("无效");} elseSystem.out.println("无效");}}

如果只是简单判断 r = /^(\d{18}|\d{17}x)$/;(只需要判断18位数字活着17位数字+一位x)
如果想写的复杂点,就需要根据身份证上每一位数字的含义去写对应的规则。比如生日那部分。只能是生日区间的数字。
如果判断的准确无误,去找公安局或者其他官方的对外验证真伪的接口。
小伙子,我看你骨骼惊奇,是万年难遇的练武奇才,我这里有一本30分钟速成神功宝典。有兴趣就拿去