任务一:正则表达式
package Test;
import Naraku.*;
import java.util.Calendar;
public class Regular_Expression {
public static void getDate(int[] d) {
Calendar Nowdate = Calendar.getInstance();
d[0]=Nowdate.get(Calendar.YEAR);
d[1]=Nowdate.get(Calendar.MONTH)+1;
d[2]=Nowdate.get(Calendar.DATE);
}
public static String numToString(int[] d) {
String now;
int i;
now = "" + d[0] +'-';
for(i=1;i<3;i++) {
if(d[i]>=10)
now = now + d[i];
else
now = now + 0 + d[i];
if(i==1)
now = now + '-';
}
return now;
}
public static Boolean Regular(int y,String T) {
boolean flag;
String Reg_Exp;
flag = Nara.isLeapYear(y);
if(flag)
Reg_Exp = "(([0-9]{4})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[12][0-9]))))";
else
Reg_Exp = "(([0-9]{4})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|1[0-9]|2[0-8]))))";
return T.matches(Reg_Exp);
}
public static void main(String[] args) {
String Today;
int[] date;
boolean flag;
date = new int[3];
getDate(date);
Today = numToString(date);
flag = Regular(date[0],Today);
if (flag)
System.out.println("Today is:\n"+ Today + "\nMatched Was Successful !");
else
System.out.println("Today is:\n"+ Today + "\nMatched Was Failed !");
}
}
以上是完整代码,看不懂没关系,下面按方法讲解:
首先,我们来看main()方法
public static void main(String[] args) {
String Today;
int[] date;
boolean flag;
date = new int[3];
getDate(date);
Today = numToString(date);
flag = Regular(date[0],Today);
if (flag)
System.out.println("Today is:\n"+ Today + "\nMatched Was Successful !");
else
System.out.println("Today is:\n"+ Today + "\nMatched Was Failed !");
}
L03:Today用来存放要匹配的日期
L04:date用来存放从系统中读取的年,月,日
L05:flag用来判断要匹配的日期与正则表达式是否匹配
L09:getDate(date) 这里会调用 getDate() 方法,读取系统的年,月,日,分别存储在date中返回来
L10:Today = numToString(date) 这里将上一步中读取的年,月,日按格式写入Today中返回
L11:flag = Regular(date[0],Today) 这个方法实现正则表达式和日期的匹配,成功返回true,失败返回false
L13:这里的 if 就是通过匹配的结果来输出是否成功的提示
第二个方法getDate(),作用是读取当前的年,月,日
public static void getDate(int[] d) {
Calendar Nowdate = Calendar.getInstance();
d[0]=Nowdate.get(Calendar.YEAR);
d[1]=Nowdate.get(Calendar.MONTH)+1;
d[2]=Nowdate.get(Calendar.DATE);
}
这个方法应该很容易看懂
L02:创建 calendar 对象,这个类可以读取当前系统的日期信息
L03:读取年
L04:读取月
L05:读取日
第三个方法 Today = numToString(date) ,将年,月,日按格式存储
public static String numToString(int[] d) {
String now;
int i;
now = "" + d[0] +'-';
for(i=1;i<3;i++) {
if(d[i]>=10)
now = now + d[i];
else
now = now + 0 + d[i];
if(i==1)
now = now + '-';
}
return now;
}
L02:now 用来存放转换后的字符串
L04:首先把 d[0] 中的元素放进去,也就是年份,然后再加上 ’ - ’ 用于分别年,月,日
L05:这个循环用于将月,日放入 now 中,鉴于要凑够两位数,所以放入时要区分一下,1-9前面要补零,月份后面也要接 ’ - ’ 用于区分
L13:返回now
最后一个方法 Regular,用来匹配正则表达式和日期
public static Boolean Regular(int y,String T) {
boolean flag;
String Reg_Exp;
flag = Nara.isLeapYear(y);
if(flag)
Reg_Exp = "(([0-9]{4})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[12][0-9]))))";
else
Reg_Exp = "(([0-9]{4})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|1[0-9]|2[0-8]))))";
return T.matches(Reg_Exp);
}
L04:这里可以看见我调用了一个方法,这个方法是我自己创建的一个库,还在逐步完善,里面存放常用方法,这里就是调用的判断是否为闰年。
L05:若是闰年,就用第一条正则表达式,允许出现****-02-29的情况,否则第二条,不允许出现该情况
L10:用于正式匹配,将匹配的结果返回 main() 方法
下面附上两个正则表达式的书写根据