有关使用方法
Pattern类
-组是正则表达式的一个子集,每个组都有一个编号,通过从左到右计算左括号来进行编号。
特殊情形:组0代表的是整个正则表达式
Pattern类的编译:
Pattern p = Pattern.compile("正则表达式");
---这里的编译出来的结果可以用于后续的Matcher类
---还可以用于模式的匹配。
---正则表达式中每个括号内可以标记出组名,在后续matcher对象可以直接根据组名来返回匹配到的模式
Matcher类
Matcher m = p.matcher(欲匹配的字符串);
如果想在字符串中找到匹配好的模式,那么只需调用如下的方式:
if (m1.find())
{
System.out.printf("group0: %s\n", m1.group());
System.out.printf("group1: %s\n", m1.group(1));
System.out.printf("group2: %s\n", m1.group(2));
}
如果在正则表达式中使用了组名,那么调用如下形式的方法:
if (m1.find())
{
System.out.printf("group0: %s\n", m1.group());
System.out.printf("group1: %s\n", m1.group(组名1));
System.out.printf("group2: %s\n", m1.group(组名2));
}
attention:必须在group之前调用find方法。
如果要匹配整个字符串(看整个字符串是否符合正则表达式的形式),那么仅需要如下所示:
m1.matches(字符串);
如果m1符合正则表达式所指定的模式,那么返回true,否则返回false
Lab3中语法驱动的编程
准备对文件进行逐行读取。对读取的每一行应用正则表达式进行解析。每一行的组成一共有6种情形:
- 以Employee开头的行,解析的正则表达式为:Employee.*
- 以Roster开头的行,解析的正则表达式为:Roster.*
- 以Period开头的行,解析的正则表达式为: Period\{(?<g1>\d\d\d\d)\-(?<g2>\d\d)\-(?<g3>\d\d)\,(?<g4>\d\d\d\d)\-(?<g5>\d\d)\-(?<g6>\d\d)\};这里的第一个括号里的内容代表开始年的模式,第二个括号里的内容代表开始月的模式.....以此类推。
- 员工信息行,解析的正则表达式为:
(?<g1>([a-zA-Z])+)\\{(?<g2>([a-zA-Z])+\\ ?([a-zA-Z])*)\\,(?<g3>\\d\\d\\d)\\-(?<g4>\\d\\d\\d\\d)\\-(?<g5>\\d\\d\\d\\d)\\}
第一个括号里的内容代表员工姓名,第二个括号内容代表员工职位信息,以 ?表明职位中的空格可以出现一次或者多次。第三个括号的内容代表手机号码的前三位......以此类推,后面三个括号总共代表了手机号码。
5.员工值班信息行,解析的正则表达式为: (?<g1>([a-zA-Z])+)\{(?<g2>\d\d\d\d)\-(?<g3>\d\d)\-(?<g4>\d\d)\,(?<g5>\d\d\d\d)\-(?<g6>\d\d)\-(?<g7>\d\d)\}
第一个括号代表员工名称,后面的括号分别代表开始日期和结束日期。
6.特殊行:以}开头的行,直接忽略;正则表达式为}.*