正则
Pattern 类用于定义正则表达式,Matcher 类用于匹配正则表达式。
Pattern 没有构造器,使用工厂方法 compile()
创建模式(pattern)。
static Pattern compile(String pattern)
它将字符串转换成 Matcher 可以使用的正则表达式。Pattern 的 matcher()
方法创建 Matcher。
Matcher matcher(CharSequence str)
str 表示和模式匹配的字符串,CharSequence 接口定义只读字符序列。
Matcher 没有构造器,它的方法用于模式匹配操作。如果模式和整个字符串匹配,则 matches()
方法返回 true,否则返回 false;如果模式和字符串的某个子串匹配,find()
方法返回 true,否则返回 false,该方法可以重复调用,每次从上次匹配子串的下一个索引开始;group()
方法返回最后一个匹配的子串;start()
方法返回当前匹配的索引;end()
方法返回当前匹配的下一个索引;replaceAll(String newStr)
方法替换所有匹配的子串,然后返回替换后的字符串。
[xyz]
匹配方括号中任意一个字符,可以指定范围 [a-e]
,取反使用 ^
,比如 [^a-e]
。.
匹配任意字符。限定符如下
+
匹配 1 或多个字符,x+
*
匹配 0 或多个字符,x*
?
匹配 0 或 1 个字符,x?
public static void m() {
Pattern p = Pattern.compile("xyz");
Matcher m = p.matcher("xyz");
// true
boolean f = m.matches();
m = p.matcher("xyza");
// false 必须整个字符串精确匹配
f = m.matches();
// 返回 true,存在子串可以匹配
m.find();
p = Pattern.compile("txt");
m = p.matcher("txt345txt");
// 输出
// 0
// 6
while (m.find()) {
System.out.println(m.start())
}
}
public static void m() {
Pattern p = Pattern.compile("w+");
Matcher m = p.matcher("w ww www");
// 匹配 1 或多个 w,+ 和前面的字符作为一个整体
// w
// ww
// www
while (m.find()) {
System.out.println(m.group());
}
p = Pattern.compile("e.+d");
m = p.matcher("end extend");
// 匹配按照贪婪原则,尽可能长的匹配
// end extend
while (m.find()) {
System.out.println(m.group());
}
p = Pattern.compile("e.+?d");
m = p.matcher("end extend");
// 加 ? 表示最短匹配
// end
// extend
while (m.find()) {
System.out.println(m.group());
}
p = Pattern.compile("[a-z]+");
m = p.matcher("this is a test");
// this
// is
// a
// test
while (m.find()) {
System.out.println(m.group());
}
String s = "abc asli aouojl aobso";
p = Pattern.compile("a.*? ");
m = p.matcher(s);
String r = m.replaceAll("b ");
// b b b aobso
System.out.println(r);
// one two three four
p = Pattern.compile("[ ,.]+");
String[] str = p.split("one two,three.four");
for (String e : str) {
System.out.print(e + " ");
}
}
如果只执行一次模式匹配,可以使用 Pattern 的 matches()
方法。
// pattern 编译后是否匹配 str 返回 true/false
static boolean matches(String pattern, CharSequence str)
String 的 matches()
方法也可以使用。
// 调用该方法的字符串是否匹配 pattern
boolean matches(String pattern)
反射
Member 接口定义的方法可以获取类属性、构造器或者方法的信息。
类 | 描述 |
---|---|
AccessibleObject | 绕过默认访问控制检查 |
Array | 动态创建和操作数组 |
Constructor | 构造器信息 |
Executable | Method 和 Constructor 继承的抽象类 |
Field | 属性信息 |
Method | 方法信息 |
Modifier | 类和方法的访问修饰符信息 |
Parameter | 参数信息 |
Proxy | 支持动态代理类 |
ReflectPermission | 允许反射类的私有和 protected 成员 |
public static void main(String[] args) {
try {
Class<?> class1 = Class.forName("java.awt.Dimension");
Constructor<?>[] constructors = class1.getConstructors();
for (int i = 0; i < constructors.length; i++) {
System.out.println(constructors[i]);
}
Field[] fields = class1.getFields();
Method[] methods = class1.getMethods();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
class Tested {
public void pub() {};
private void pri() {};
protected void pro() {};
}
public static void m() {
Tested a = new Tested();
Class<? extends Tested> class1 = a.getClass();
// 获取类自己定义的方法,不包括继承的方法
Method[] methods = class1.getDeclaredMethods();
// 输出 pub
for (int i = 0; i < methods.length; i++) {
// 返回方法的修饰符,以整数表示
int modifiers = methods[i].getModifiers();
if (Modifier.isPublic(modifiers)) {
System.out.println(methods[i].getName());
}
}
}
文本格式化
DateFormat 抽象类提供了用于格式化日期和时间的功能。它的 getDateInstance(int style, Locale locale)
方法是重载方法之一,返回的实例用于格式化日期。其中,style 的取值为 DateFormat 定义的 int 常量:DEFAULT/SHORT/MEDIUM/LONG/FULL 中的一个,表示不同形式的日期。locale 则和本地化有关。它的 format(Date d)
方法返回已格式化的日期,类型为 String。
public class DateFormatDemo {
public static void main(String[] args) {
Date date = new Date();
DateFormat df = null;
df = DateFormat.getDateInstance(DateFormat.SHORT, Locale.CHINA);
// 23-7-16
System.out.println(df.format(date));
df = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);
// 2023-7-16
System.out.println(df.format(date));
df = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINA);
// 2023年7月16日
System.out.println(df.format(date));
df = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.JAPAN);
// 2023/07/16
System.out.println(df.format(date));
df = DateFormat.getDateInstance(DateFormat.LONG, Locale.KOREA);
// 2023년 7월 16일 (일)
System.out.println(df.format(date));
}
}
它的 getTimeInstance(int style, Locale locale)
方法返回的实例用于格式化时间,参数取值和作用类似于先前所述,此时作用于时间。
public class TimeFormatDemo {
public static void main(String[] args) {
Date date = new Date();
DateFormat df = null;
df = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.CHINA);
// 下午9:48
System.out.println(df.format(date));
df = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.CHINA);
// 21:48:46
System.out.println(df.format(date));
df = DateFormat.getTimeInstance(DateFormat.LONG, Locale.CHINA);
// 下午09时48分46秒
System.out.println(df.format(date));
df = DateFormat.getTimeInstance(DateFormat.LONG, Locale.JAPAN);
// 21:48:46 CST
System.out.println(df.format(date));
df = DateFormat.getTimeInstance(DateFormat.LONG, Locale.KOREA);
// 오후 9시 48분 46초
System.out.println(df.format(date));
}
}
它的 getDateTimeInstance(int style, Locale locale)
方法返回的实例用于格式化日期和时间。
SimpleDateFormat 类是 DateFormat 类的子类,可以自定义日期和时间格式。构造器 SimpleDateFormat(String fmtStr)
中,fmtStr 表示自定义的日期和时间格式。取值如下
符号 | 说明 |
---|---|
a | AM 或 PM |
d | 月中某一天(1-31) |
h | AM/PM 表示的小时(1-12) |
k | 一天中某一小时(1-24) |
m | 一小时中某一分钟(0-59) |
s | 一分钟中某一秒(0-59) |
u | 一周某一天,1 表示星期一 |
w | 一年中某一周(1-52) |
y | 年 |
z | 时区 |
D | 一年中某一天(1-366) |
E | 一周中某一天(例如,Monday) |
public class SimpleDateFormatDemo {
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat sdf = null;
sdf = new SimpleDateFormat("hh:mm:ss");
// 10:06:49
System.out.println(sdf.format(date));
sdf = new SimpleDateFormat("yyyy MM dd hh:mm:ss zzz");
// 2023 07 16 10:06:49 CST
System.out.println(sdf.format(date));
sdf = new SimpleDateFormat("yyyy MM dd");
// 2023 07 16
System.out.println(sdf.format(date));
}
}
jdk8 引入的表示日期和时间的新类中,LocalDate、LocalTime 和 LocalDateTime 类位于类层次结构的顶层。三者遵循 ISO 8601 规定的公历标准。它们没有定义 public 构造器,提供了工厂方法 now()
返回当前系统的日期和时间。
public class DateTimeDemo {
public static void main(String[] args) {
LocalDate curDate = LocalDate.now();
// 2023-07-16
System.out.println(curDate);
LocalTime curTime = LocalTime.now();
// 22:22:52.273
System.out.println(curTime);
LocalDateTime cur = LocalDateTime.now();
// 2023-07-16T22:22:52.273
System.out.println(cur);
}
}
LocalDateTime 类的 toLocalDate()
方法和 toLocalTime()
方法分别返回该对象的日期部分和时间部分的引用。
三者的 format(DateTimeFormatter fmt)
方法用于自定义日期和时间格式。**DateTimeFormatter ** 类的对象使用工厂方法获取,有
static DateTimeFormatter ofLocalizedDate(FormatStyle date);
static DateTimeFormatter ofLocalizedTime(FormatStyle time);
static DateTimeFormatter ofLocalizedDateTime(FormatStyle fmt, FormatStyle date);
根据想要格式化的类型选择不同的方法。FormatStyle 枚举定义的常量表示不同格式,有
- FULL
- LONG
- MEDIUM
- SHORT
和前述类似。
public class DateTimeDemo2 {
public static void main(String[] args) {
LocalDate curDate = LocalDate.now();
// 2023年7月16日
System.out.println(curDate.format(DateTimeFormatter.ofLocalizedDate(
FormatStyle.LONG)));
LocalTime curTime = LocalTime.now();
// 22:41:15
System.out.println(curTime.format(DateTimeFormatter.ofLocalizedTime(
FormatStyle.MEDIUM)));
LocalDateTime cur = LocalDateTime.now();
// 2023年7月16日 星期日 22:41:15
System.out.println(cur.format(DateTimeFormatter.ofLocalizedDateTime(
FormatStyle.FULL, FormatStyle.MEDIUM)));
}
}
如果想要自定义日期时间格式,使用 DateTimeFormatter 类的 ofPattern(String fmt)
方法,接收自定义日期和时间格式,返回 DateTimeFormatter 对象。如果在格式字符串中想要使用普通文本,用单引号将其包裹起来。
public class DateTimeDemo3 {
public static void main(String[] args) {
LocalDate curDate = LocalDate.now();
// 2023 年 07 月 16 日
System.out.println(curDate.format(
DateTimeFormatter.ofPattern(
"yyyy '年' MM '月' dd '日'",
Locale.CHINA)));
}
}
LocalDate、LocalTime 和 LocalDateTime 类提供的 parse(CharSequence dtstr)
方法解析字符串形式的日期时间默认格式,不符合则抛出异常。parse(CharSequence str, DateTimeFormatter fmt)
根据 fmt 的格式解析字符串。
public class DateTimeDemo4 {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.parse(
"2020 06 01 12:30:29",
DateTimeFormatter.ofPattern("yyyy MM dd HH:mm:ss"));
System.out.println(dateTime
.format(DateTimeFormatter.ofPattern(
"yyyy'年' MM'月' dd'日' hh'时 'mm'分 'ss'秒'",
Locale.CHINA)));
}
}
参考
[1] Herbert Schildt, Java The Complete Reference 11th, 2019.