建立网站站点的步骤公司logo设计logo
Java 日期时间
java.util包提供了Date类来封装当前的日期和时间。Date类提供两个构造函数来实例化Date对象。
第一个构造函数使用当前日期和时间来初始化对象。
Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
Date(long millisec)Date对象创建以后,可以调用下面的方法。
序号  | 方法和描述  | 
1  | boolean after(Date date) 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。  | 
2  | boolean before(Date date) 若当调用此方法的Date对象在指定日期之前返回true,否则返回false。  | 
3  | Object clone( ) 返回此对象的副本。  | 
4  | int compareTo(Date date) 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。  | 
5  | int compareTo(Object obj) 若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException。  | 
6  | boolean equals(Object date) 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。  | 
7  | long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。  | 
8  | int hashCode( ) 返回此对象的哈希码值。  | 
9  | void setTime(long time) 用自1970年1月1日00:00:00 GMT以后时间毫秒数设置时间和日期。  | 
10  | String toString( ) 转换Date对象为String表示形式,并返回该字符串。  | 
获取当前日期时间
Java中获取当前日期和时间很简单,使用Date对象的 toString()方法来打印当前日期和时间,如下所示:
import java.util.Date;publicclassMain{publicstaticvoidmain(String args[]){// 初始化 Date 对象Date date = new Date();// 使用 toString() 函数显示日期时间System.out.println(date.toString());}
}尝试一下
以上实例编译运行结果如下:
Mon May 0409:51:52 CDT 2013日期比较
Java使用以下三种方法来比较两个日期:
使用getTime( ) 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
使用方法before(),after()和equals()。例如,一个月的12号比18号早,则new Date(99, 2, 12).before(new Date (99, 2, 18))返回true。
使用compareTo()方法,它是由Comparable接口定义的,Date类实现了这个接口。
使用SimpleDateFormat格式化日期
SimpleDateFormat是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat允许你选择任何用户自定义日期时间格式来运行。例如:
import java.util.*;
import java.text.*;publicclassMain{publicstaticvoidmain(String args[]){Date dNow = new Date( );SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");System.out.println("Current Date: " + ft.format(dNow));}
}尝试一下
以上实例编译运行结果如下:
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT简单的DateFormat格式化编码
时间模式字符串用来指定时间格式。在此模式中,所有的ASCII字母被保留为模式字母,定义如下:
字母  | 描述  | 示例  | 
G  | 纪元标记  | 广告  | 
y  | 四位年份  | 2001  | 
M  | 月份  | 七月或07  | 
d  | 一个月的日期  | 10  | 
h  | 上午/下午 (1~12)格式小时  | 12  | 
H  | 一天中的小时 (0~23)  | 22  | 
m  | 分钟数  | 30  | 
s  | 秒数  | 55  | 
S  | 毫秒数  | 234  | 
E  | 星期几  | 星期二  | 
D  | 一年中的日子  | 360  | 
F  | 一个月中第几周的周几  | 2 (<>月第二个星期三)  | 
w  | 一年中第几周  | 40  | 
W  | 一个月中第几周  | 1  | 
一个  | 上午/下午标记  | 下午  | 
k  | 一天中的小时(1~24)  | 24  | 
K  | 上午/下午 (0~11)格式小时  | 10  | 
z  | 时区  | 东部标准时间  | 
'  | 文字定界符  | 定界符  | 
"  | 单引号  | `  | 
使用printf格式化日期
printf方法可以很轻松地格式化时间和日期。使用两个字母格式,它以t开头并且以下面表格中的一个字母结尾。例如:
import java.util.Date;publicclassMain{publicstaticvoidmain(String args[]){// 初始化 Date 对象Date date = new Date();// 使用toString()显示日期和时间String str = String.format("Current Date/Time : %tc", date );System.out.printf(str);}
}尝试一下
以上实例编译运行结果如下:
Current Date/Time : Sat Dec 1516:37:57 MST 2012如果你需要重复提供日期,那么利用这种方式来格式化它的每一部分就有点复杂了。因此,可以利用一个格式化字符串指出要被格式化的参数的索引。
索引必须紧跟在%后面,而且必须以$结束。例如:
import java.util.Date;publicclassMain{publicstaticvoidmain(String args[]){// 初始化 Date 对象Date date = new Date();// 使用toString()显示日期和时间System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);}
}尝试一下
以上实例编译运行结果如下:
Due date: February 09, 2004或者,你可以使用<标志。它表明先前被格式化的参数要被再次使用。例如:
import java.util.Date;publicclassMain{publicstaticvoidmain(String args[]){// 初始化 Date 对象Date date = new Date();// 显示格式化时间System.out.printf("%s %tB %<te, %<tY","Due date:", date);}
} 尝试一下
以上实例编译运行结果如下:
Due date: February 09, 2004日期和时间转换字符
字符  | 描述  | 例子  | 
c  | 完整的日期和时间  | Mon May 04 09:51:52 CDT 2009  | 
F  | ISO 8601 格式日期  | 2004-02-09  | 
D  | U.S. 格式日期 (月/日/年)  | 02/09/2004  | 
T  | 24小时时间  | 18:05:19  | 
r  | 12小时时间  | 06:05:19 pm  | 
R  | 24小时时间,不包含秒  | 18:05  | 
Y  | 4位年份(包含前导0)  | 2004  | 
y  | 年份后2位(包含前导0)  | 04  | 
C  | 年份前2位(包含前导0)  | 20  | 
B  | 月份全称  | 二月  | 
b  | 月份简称  | 2月  | 
n  | 2位月份(包含前导0)  | 02  | 
d  | 2位日子(包含前导0)  | 03  | 
e  | 2位日子(不包含前导0)  | 9  | 
一个  | 星期全称  | 星期一  | 
一个  | 星期简称  | 星期一  | 
j  | 3位年份(包含前导0)  | 069  | 
H  | 2位小时(包含前导0), 00 到 23  | 18  | 
k  | 2位小时(不包含前导0), 0 到 23  | 18  | 
我  | 2位小时(包含前导0), 01 到 12  | 06  | 
l  | 2位小时(不包含前导0), 1 到 12  | 6  | 
M  | 2位分钟(包含前导0)  | 05  | 
S  | 2位秒数(包含前导0)  | 19  | 
L  | 3位毫秒(包含前导0)  | 047  | 
N  | 9位纳秒(包含前导0)  | 047000000  | 
P  | 大写上下午标志  | 下午  | 
p  | 小写上下午标志  | 下午  | 
z  | 从GMT的RFC 822数字偏移  | -0800  | 
Z  | 时区  | 太平洋标准时间  | 
s  | 自 1970-01-01 00:00:00 GMT的秒数  | 1078884319  | 
Q  | 自 1970-01-01 00:00:00 GMT的毫妙  | 1078884319047  | 
还有其他有用的日期和时间相关的类。对于更多的细节,你可以参考到Java标准文档。
解析字符串为时间
SimpleDateFormat 类有一些附加的方法,特别是parse(),它试图按照给定的 SimpleDateFormat 对象的格式化存储来解析字符串。例如:
import java.util.*;
import java.text.*;publicclassMain{publicstaticvoidmain(String args[]){SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); String input = args.length == 0 ? "1818-11-11" : args[0]; System.out.print(input + " Parses as "); Date t; try { t = ft.parse(input); System.out.println(t); } catch (ParseException e) { System.out.println("Unparseable using " + ft); }}
}尝试一下
以上实例编译运行结果如下:
$ java DateDemo
1818-11-11 Parses as Wed Nov 1100:00:00 GMT 1818
$ java DateDemo 2007-12-012007-12-01 Parses as Sat Dec 0100:00:00 GMT 2007Java 休眠(sleep)
你可以让程序休眠一毫秒的时间或者到您的计算机的寿命长的任意段时间。例如,下面的程序会休眠3秒:
import java.util.*;publicclassMain{publicstaticvoidmain(String args[]){try { System.out.println(new Date( ) + "\n"); Thread.sleep(5*60*10); System.out.println(new Date( ) + "\n"); } catch (Exception e) { System.out.println("Got an exception!"); }}
}尝试一下
以上实例编译运行结果如下:
Sun May 0318:04:41 GMT 2009Sun May 0318:04:44 GMT 2009测量时间
下面的一个例子表明如何测量时间间隔(以毫秒为单位):
import java.util.*;publicclassMain{publicstaticvoidmain(String args[]){try {long start = System.currentTimeMillis( );System.out.println(new Date( ) + "\n");Thread.sleep(5*60*10);System.out.println(new Date( ) + "\n");long end = System.currentTimeMillis( );long diff = end - start;System.out.println("Difference is : " + diff);} catch (Exception e) {System.out.println("Got an exception!");}}
}尝试一下
以上实例编译运行结果如下:
Sun May 0318:16:51 GMT 2009Sun May 0318:16:54 GMT 2009Difference is : 3050Calendar类
我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类。
Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。
Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。
创建一个代表系统当前日期的Calendar对象
Calendar c = Calendar.getInstance();//默认是当前日期创建一个指定日期的Calendar对象
使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。
//创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);Calendar类对象字段类型
Calendar类中用一下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想
常量  | 描述  | 
Calendar.YEAR  | 年份  | 
Calendar.MONTH  | 月份  | 
Calendar.DATE  | 日期  | 
Calendar.DAY_OF_MONTH  | 日期,和上面的字段意义完全相同  | 
Calendar.HOUR  | 12小时制的小时  | 
Calendar.HOUR_OF_DAY  | 24小时制的小时  | 
Calendar.MINUTE  | 分钟  | 
Calendar.SECOND  | 秒  | 
Calendar.DAY_OF_WEEK  | 星期几  | 
Calendar类对象信息的设置
Set设置
如:
Calendar c1 = Calendar.getInstance();调用:
publicfinalvoidset(int year,int month,int date)c1.set(2009, 6 - 1, 12);//把Calendar对象c1的年月日分别设这为:2009、5、12利用字段类型设置
如果只设定某个字段,例如日期的值,则可以使用如下set方法:
publicvoidset(int field,int value)把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算
c1.set(Calendar.DATE,10);把c1对象代表的年份设置为2008年,其他的所有数值会被重新计算
c1.set(Calendar.YEAR,2008);其他字段属性set的意义以此类推
Add设置
Calendar c1 = Calendar.getInstance();把c1对象的日期加上10,也就是c1所表的日期的10天后的日期,其它所有的数值会被重新计算
c1.add(Calendar.DATE, 10);把c1对象的日期减去10,也就是c1所表的日期的10天前的日期,其它所有的数值会被重新计算
c1.add(Calendar.DATE, -10);其他字段属性的add的意义以此类推
Calendar类对象信息的获得
Calendar c1 = Calendar.getInstance();
// 获得年份int year = c1.get(Calendar.YEAR);
// 获得月份int month = c1.get(Calendar.MONTH) + 1;
// 获得日期int date = c1.get(Calendar.DATE);
// 获得小时int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟int minute = c1.get(Calendar.MINUTE);
// 获得秒int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)int day = c1.get(Calendar.DAY_OF_WEEK);GregorianCalendar类
Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。
Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar定义了两个字段:AD和BC。这些代表公历定义的两个时代。
下面列出GregorianCalendar对象的几个构造方法:
序号  | 构造函数和说明  | 
1  | GregorianCalendar() 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。  | 
2  | GregorianCalendar(int year, int month, int date) 在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar  | 
3  | GregorianCalendar(int year, int month, int date, int hour, int minute) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。  | 
4  | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。  | 
5  | GregorianCalendar(Locale aLocale) 在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar。  | 
6  | GregorianCalendar(TimeZone zone) 在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。  | 
7  | GregorianCalendar(TimeZone zone, Locale aLocale) 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。  | 
这里是GregorianCalendar 类提供的一些有用的方法列表:
序号  | 方法和说明  | 
1  | void add(int field, int amount) 根据日历规则,将指定的(有符号的)时间量添加到给定的日历字段中。  | 
2  | protected void computeFields() 转换UTC毫秒值为时间域值  | 
3  | protected void computeTime() 覆盖Calendar ,转换时间域值为UTC毫秒值  | 
4  | boolean equals(Object obj) 比较此 GregorianCalendar 与指定的 Object。  | 
5  | int get(int field) 获取指定字段的时间值  | 
6  | int getActualMaximum(int field) 返回当前日期,给定字段的最大值  | 
7  | int getActualMinimum(int field) 返回当前日期,给定字段的最小值  | 
8  | int getGreatestMinimum(int field) 返回此 GregorianCalendar 实例给定日历字段的最高的最小值。  | 
9  | Date getGregorianChange() 获得格里高利历的更改日期。  | 
10  | int getLeastMaximum(int field) 返回此 GregorianCalendar 实例给定日历字段的最低的最大值  | 
11  | int getMaximum(int field) 返回此 GregorianCalendar 实例的给定日历字段的最大值。  | 
12  | Date getTime() 获取日历当前时间。  | 
13  | long getTimeInMillis() 获取用长整型表示的日历的当前时间  | 
14  | TimeZone getTimeZone() 获取时区。  | 
15  | int getMinimum(int field) 返回给定字段的最小值。  | 
16  | int hashCode() 重写hashCode.  | 
17  | boolean isLeapYear(int year) 确定给定的年份是否为闰年。  | 
18  | void roll(int field, boolean up) 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。  | 
19  | void set(int field, int value) 用给定的值设置时间字段。  | 
20  | void set(int year, int month, int date) 设置年、月、日的值。  | 
21  | void set(int year, int month, int date, int hour, int minute) 设置年、月、日、小时、分钟的值。  | 
22  | void set(int year, int month, int date, int hour, int minute, int second) 设置年、月、日、小时、分钟、秒的值。  | 
23  | void setGregorianChange(Date date) 设置 GregorianCalendar 的更改日期。  | 
24  | void setTime(Date date) 用给定的日期设置Calendar的当前时间。  | 
25  | void setTimeInMillis(long millis) 用给定的long型毫秒数设置Calendar的当前时间。  | 
26  | void setTimeZone(TimeZone value) 用给定时区值设置当前时区。  | 
27  | String toString() 返回代表日历的字符串。  | 
实例
import java.util.*;publicclassGregorianCalendarDemo{publicstaticvoidmain(String args[]){String months[] = {"Jan", "Feb", "Mar", "Apr","May", "Jun", "Jul", "Aug","Sep", "Oct", "Nov", "Dec"};int year;// 初始化 Gregorian 日历// 使用当前时间和日期// 默认为本地时间和时区GregorianCalendar gcalendar = new GregorianCalendar();// 显示当前时间和日期的信息System.out.print("Date: ");System.out.print(months[gcalendar.get(Calendar.MONTH)]);System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");System.out.println(year = gcalendar.get(Calendar.YEAR));System.out.print("Time: ");System.out.print(gcalendar.get(Calendar.HOUR) + ":");System.out.print(gcalendar.get(Calendar.MINUTE) + ":");System.out.println(gcalendar.get(Calendar.SECOND));// 测试当前年份是否为闰年if(gcalendar.isLeapYear(year)) {System.out.println("当前年份是闰年");}else {System.out.println("当前年份不是闰年");}}
}以上实例编译运行结果如下:
Date: Apr 222009
Time: 11:25:27
当前年份不是闰年关于Calender 类的完整列表,你可以参考标准的Java文档。
Java 正则表达式
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
Java正则表达式和Perl的是最为相似的。
java.util.regex包主要包括以下三个类:
Pattern类:
pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个Pattern对象,你必须首先调用其公共静态编译方法,它返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher类:
Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象。
PatternSyntaxException:
PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
捕获组
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
例如,正则表达式(dog) 创建了单一分组,组里包含"d","o",和"g"。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:
((A)(B(C)))
(A)
(B(C))
(C)
可以通过调用matcher对象的groupCount方法来查看表达式有多少个分组。groupCount方法返回一个int值,表示matcher对象当前有多个捕获组。
还有一个特殊的组(组0),它总是代表整个表达式。该组不包括在groupCount的返回值中。
实例
下面的例子说明如何从一个给定的字符串中找到数字串:
import java.util.regex.Matcher;
import java.util.regex.Pattern;publicclassRegexMatches{publicstaticvoidmain( String args[] ){// 按指定模式在字符串查找String line = "This order was placed for QT3000! OK?";String pattern = "(.*)(\\d+)(.*)";// 创建 Pattern 对象Pattern r = Pattern.compile(pattern);// 现在创建 matcher 对象Matcher m = r.matcher(line);if (m.find( )) {System.out.println("Found value: " + m.group(0) );System.out.println("Found value: " + m.group(1) );System.out.println("Found value: " + m.group(2) );} else {System.out.println("NO MATCH");}}
}以上实例编译运行结果如下:
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0正则表达式语法
字符  | 说明  | 
\  | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,"n"匹配字符"n"。"\n"匹配换行符。序列"\\"匹配"\","\("匹配"("。  | 
^  | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。  | 
$  | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。  | 
*  | 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。  | 
+  | 一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。  | 
?  | 零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。  | 
{n}  | n 是非负整数。正好匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。  | 
{n,}  | n 是非负整数。至少匹配 n 次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的所有 o。"o{1,}"等效于"o+"。"o{0,}"等效于"o*"。  | 
{n,m}  | M 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。  | 
?  | 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o"。  | 
.  | 匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使用诸如"[\s\S]"之类的模式。  | 
(pattern)  | 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果"匹配"集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用"\("或者"\)"。  | 
(?:pattern)  | 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。  | 
(?=pattern)  | 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。  | 
(?!pattern)  | 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。  | 
x|y  | 匹配 x 或 y。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。  | 
[xyz]  | 字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。  | 
[^xyz]  | 反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。  | 
[a-z]  | 字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。  | 
[^a-z]  | 反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符。  | 
\b  | 匹配一个字边界,即字与空格间的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。  | 
\B  | 非字边界匹配。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。  | 
\cx  | 匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是"c"字符本身。  | 
\d  | 数字字符匹配。等效于 [0-9]。  | 
\D  | 非数字字符匹配。等效于 [^0-9]。  | 
\f  | 换页符匹配。等效于 \x0c 和 \cL。  | 
\n  | 换行符匹配。等效于 \x0a 和 \cJ。  | 
\r  | 匹配一个回车符。等效于 \x0d 和 \cM。  | 
\s  | 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。  | 
\S  | 匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。  | 
\t  | 制表符匹配。与 \x09 和 \cI 等效。  | 
\v  | 垂直制表符匹配。与 \x0b 和 \cK 等效。  | 
\w  | 匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。  | 
\W  | 与任何非单词字符匹配。与"[^A-Za-z0-9_]"等效。  | 
\xn  | 匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,"\x41"匹配"A"。"\x041"与"\x04"&"1"等效。允许在正则表达式中使用 ASCII 代码。  | 
\num  | 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。  | 
\n  | 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。  | 
\nm  | 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。如果两种前面的情况都不存在,则 \nm 匹配八进制值 nm,其中 n 和 m 是八进制数字 (0-7)。  | 
\nml  | 当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。  | 
\un  | 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。  | 
Matcher类的方法
索引方法
索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:
序号  | 方法及说明  | 
1  | public int start() 返回以前匹配的初始索引。  | 
2  | public int start(int group) 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引  | 
3  | public int end() 返回最后匹配字符之后的偏移量。  | 
4  | public int end(int group) 返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。  | 
研究方法
研究方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:
序号  | 方法及说明  | 
1  | public boolean lookingAt() 尝试将从区域开头开始的输入序列与该模式匹配。  | 
2  | public boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列。  | 
3  | public boolean find(int start) 重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。  | 
4  | public boolean matches() 尝试将整个区域与模式匹配。  | 
替换方法
替换方法是替换输入字符串里文本的方法:
序号  | 方法及说明  | 
1  | public Matcher appendReplacement(StringBuffer sb, String replacement) 实现非终端添加和替换步骤。  | 
2  | public StringBuffer appendTail(StringBuffer sb) 实现终端添加和替换步骤。  | 
3  | public String replaceAll(String replacement) 替换模式与给定替换字符串相匹配的输入序列的每个子序列。  | 
4  | public String replaceFirst(String replacement) 替换模式与给定替换字符串匹配的输入序列的第一个子序列。  | 
5  | public static String quoteReplacement(String s) 返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递给Matcher类的appendReplacement 方法一个字面字符串一样工作。  | 
start 和end 方法
下面是一个对单词"cat"出现在输入字符串中出现次数进行计数的例子:
import java.util.regex.Matcher;
import java.util.regex.Pattern;publicclassRegexMatches{privatestaticfinal String REGEX = "\\bcat\\b";privatestaticfinal String INPUT ="cat cat cat cattie cat";publicstaticvoidmain( String args[] ){Pattern p = Pattern.compile(REGEX);Matcher m = p.matcher(INPUT); // 获取 matcher 对象int count = 0;while(m.find()) {count++;System.out.println("Match number "+count);System.out.println("start(): "+m.start());System.out.println("end(): "+m.end());}}
}以上实例编译运行结果如下:
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22可以看到这个例子是使用单词边界,以确保字母 "c" "a" "t" 并非仅是一个较长的词的子串。它也提供了一些关于输入字符串中匹配发生位置的有用信息。
Start方法返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引,end方法最后一个匹配字符的索引加1。
matches 和lookingAt 方法
matches 和lookingAt 方法都用来尝试匹配一个输入序列模式。它们的不同是matches要求整个序列都匹配,而lookingAt 不要求。
这两个方法经常在输入字符串的开始使用。
我们通过下面这个例子,来解释这个功能:
import java.util.regex.Matcher;
import java.util.regex.Pattern;publicclassRegexMatches{privatestaticfinal String REGEX = "foo";privatestaticfinal String INPUT = "fooooooooooooooooo";privatestatic Pattern pattern;privatestatic Matcher matcher;publicstaticvoidmain( String args[] ){pattern = Pattern.compile(REGEX);matcher = pattern.matcher(INPUT);System.out.println("Current REGEX is: "+REGEX);System.out.println("Current INPUT is: "+INPUT);System.out.println("lookingAt(): "+matcher.lookingAt());System.out.println("matches(): "+matcher.matches());}
}以上实例编译运行结果如下:
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): truematches(): falsereplaceFirst 和replaceAll 方法
replaceFirst 和replaceAll 方法用来替换匹配正则表达式的文本。不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。
下面的例子来解释这个功能:
import java.util.regex.Matcher;
import java.util.regex.Pattern;publicclassRegexMatches{privatestatic String REGEX = "dog";privatestatic String INPUT = "The dog says meow. " +"All dogs say meow.";privatestatic String REPLACE = "cat";publicstaticvoidmain(String[] args){Pattern p = Pattern.compile(REGEX);// get a matcher objectMatcher m = p.matcher(INPUT); INPUT = m.replaceAll(REPLACE);System.out.println(INPUT);}
}以上实例编译运行结果如下:
The cat says meow. All cats say meow.appendReplacement 和 appendTail 方法
Matcher 类也提供了appendReplacement 和appendTail 方法用于文本替换:
看下面的例子来解释这个功能:
import java.util.regex.Matcher;
import java.util.regex.Pattern;publicclassRegexMatches{privatestatic String REGEX = "a*b";privatestatic String INPUT = "aabfooaabfooabfoob";privatestatic String REPLACE = "-";publicstaticvoidmain(String[] args){Pattern p = Pattern.compile(REGEX);// 获取 matcher 对象Matcher m = p.matcher(INPUT);StringBuffer sb = new StringBuffer();while(m.find()){m.appendReplacement(sb,REPLACE);}m.appendTail(sb);System.out.println(sb.toString());}
}以上实例编译运行结果如下:
-foo-foo-foo-PatternSyntaxException 类的方法
PatternSyntaxException 是一个非强制异常类,它指示一个正则表达式模式中的语法错误。
PatternSyntaxException 类提供了下面的方法来帮助我们查看发生了什么错误。
序号  | 方法及说明  | 
1  | public String getDescription() 获取错误的描述。  | 
2  | public int getIndex() 获取错误的索引。  | 
3  | public String getPattern() 获取错误的正则表达式模式。  | 
4  | public String getMessage() 返回多行字符串,包含语法错误及其索引的描述、错误的正则表达式模式和模式中错误索引的可视化指示。  | 
