正则

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 引入的表示日期和时间的新类中,LocalDateLocalTimeLocalDateTime 类位于类层次结构的顶层。三者遵循 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.

 posted on 2024-04-24 15:08  x-yun  阅读(4)  评论(0编辑  收藏  举报