java基础问题21
2011-05-03 00:44
239 查看
73.判断身份证:要么是15位,要么是18位,最后一位可以为字母,并写程序提出其中的年月日。
答:我们可以用正则表达式来定义复杂的字符串格式,(/d{17}[0-9a-zA-Z]|/d{14}[0-9a-zA-Z])可以用来判断是否为合法的15位或18位身份证号码。因为15位和18位的身份证号码都是从7位到第12位为身份证为日期类型。这样我们可以设计出更精确的正则模式,使身份证号的日期合法,这样我们的正则模式可以进一步将日期部分的正则修改为[12][0-9]{3}[01][0-9][123][0-9],当然可以更精确的设置日期。
在jdk的java.util.Regex包中有实现正则的类,Pattern和Matcher。以下是实现代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
/**
* @param args
*/
public static void main(String[] args) {
// 测试是否为合法的身份证号码
String[] strs = { "130681198712092019", "13068119871209201x",
"13068119871209201", "123456789012345", "12345678901234x",
"1234567890123" };
Pattern p1 = Pattern.compile("(//d{17}[0-9a-zA-Z]|//d{14}[0-9a-zA-Z])");
for (int i = 0; i < strs.length; i++) {
Matcher matcher = p1.matcher(strs[i]);
System.out.println(strs[i] + ":" + matcher.matches());
}
Pattern p2 = Pattern.compile("//d{6}(//d{8}).*"); // 用于提取出生日字符串
Pattern p3 = Pattern.compile("(//d{4})(//d{2})(//d{2})");// 用于将生日字符串进行分解为年月日
for (int i = 0; i < strs.length; i++) {
Matcher matcher = p2.matcher(strs[i]);
boolean b = matcher.find();
if (b) {
String s = matcher.group(1);
Matcher matcher2 = p3.matcher(s);
if (matcher2.find()) {
System.out
.println("生日为" + matcher2.group(1) + "年"
+ matcher2.group(2) + "月"
+ matcher2.group(3) + "日");
}
}
}
}
}
相关文章推荐
- Java基础-21总结字符流,IO流编码问题,实用案例必做一遍
- Java基础-21总结字符流,IO流编码问题,实用案例
- JAVA语法基础作业——动手动脑以及课后实验性问题
- 黑马程序员——JAVA基础之多线程的安全问题
- JAVA代码—算法基础:活动安排问题(贪心算法)
- Java基础21-反射
- java一些基础问题(听说是java应聘者老被问的问题!)
- JAVA基础笔试、面试常见问题集合
- Java基础面试——传值问题
- JAVA基础编程之兔子问题
- Java做acm所需要的基础知识之基本输入输出问题
- Java基础(20,21)IO流
- Java基础学习21(代码块)
- Android 之路21---Java基础15
- java基础:继承关系类加载顺序问题
- java基础-线程间的通讯问题
- JAVA经典基础问题
- Java 基础问题整理(更新中)
- 对java初学者所要掌握的一些基础问题
- 关于java基础类型与引用类型内存存储问题,以及string.intern()方法(String两种创建方式的区别)