【Java】从头开始的Java复健day6

发布时间 2023-08-14 22:06:32作者: ryukirin

用的书:《Java从入门到精通》

day1(3.1-3.3): 【Java】从头开始的Java复健day1

day2(3.4-3.8): 【Java】从头开始的Java复健day2

day3(4.1-4.4): 【Java】从头开始的Java复健day3

day4(4.5-5.2): 【Java】从头开始的Java复健day4

day5(5.3-5.4): 【Java】从头开始的Java复健day5

第五章 字符串

5.5 格式化字符串

  • format(String format, Object...args)
    • format 格式字符串
    • args 格式字符串中由格式说明引用的参数,如果还有格式说明以外的参数,则忽略这些额外的参数
  • format(Local I, String format, Object...args)
    • I 格式化过程中要应用的语言环境 如果为null 则不进行本地化
    • format 格式字符串
    • args 格式字符串中由格式说明引用的参数,如果还有格式说明以外的参数,则忽略这些额外的参数

日期和时间字符串格式化

将输出的时间字符串变成自己想要的格式

  • 日期格式化
转换符 说明 实例
%te 一个月中的某一天(1~31) 2
%tb 指定语言环境中的月份简称 Feb(en) 二月(中)
%tB 指定语言环境中的月份全称 February(en) 二月(中)
%tA 指定语言环境中的周几全称 Monday(en) 星期一(中)
%ta 指定语言环境中的周几简称 Mon(en) 星期一(中)
%tc 包括全部日期和时间信息 星期二 三月 25 13:37:22 CST 2005
%tY 4位年份 2008
%tj 一年中的第几天(001~366) 085
%tm 月份 03
%td 一个月中的第几天(1~31) 02
%ty 2位年份 08
  • 时间格式化
转换符 说明 实例
%tH 2位数字的24小时制的小时(00~23) 14
%tI 2位数字的12小时制的小时(01~12) 05
%tk 2位数字的24小时制的小时(0~23) 5
%tl 2位数字的12小时制的小时(1~12) 10
%tM 2位数字的分钟(00~59) 05
%tS 2位数字的秒数(00~60) 12
%tL 3位数字的毫秒数(000~999) 920
%tN 9位数字的微毫秒 062000000
%tp 指定语言环境下上午或下午 下午(中) pm(en)
%tz 相对于GMT RFC 82格式的数字时区偏移量 +0800
%tZ 时区缩写形式的字符串 CST
%ts 1970-01-01 00:00:00至现在经过的秒数 1206426646
%tQ 1970-01-01 00:00:00至现在经过的毫秒数 1206426737453
  • 格式化常见的日期时间组合
转换符 说明 实例
%tF "年-月-日"格式 4位年份 2008-03-25
%tD "月/日/年"格式 2位年份 03/25/08
%tc 全部日期和时间信息 星期二 三月 25 15:20:00 CST 2008
%tr "时:分:秒 PM(AM)"格式 12时制 03:22:06 下午
%tT "时:分:秒"格式 24时制 15:23:50
%tR "时:分"格式 24时制 15:25

常规类型格式化

可以用于任何参数类型

转换符 说明 实例
%b %B 结果被格式化为布尔类型 true
%h %H 结果被格式化为散列码 A05A5198
%s %S 结果被格式化为字符串类型 "abcd"
%c %C 结果被格式化为字符类型 'a'
%d 结果被格式化为十进制整数 40
%o 结果被格式化为八进制整数 11
%x %X 结果被格式化为十六进制整数 4b1
%e 结果被格式化为用科学计数法表示的十进制数 1.700000e+01
%a 结果被格式化为带有效位数和指数的十六进制浮点数 0X1.C000000000001P4
%n 结果为特定于平台的行分隔符
%% 结果为字面值'%' %
import java.util.Date;

public class Java5_5 {
    public static void main(String[] args){
        // 日期格式化
        Date date = new Date();
        String year = String.format("%tY", date);
        String month = String.format("%tB", date);
        String day = String.format("%td", date);
        System.out.println(year + "年" + month + day + "日");

        // 时间格式化
        String hour = String.format("%tH", date);
        String minute = String.format("%tM", date);
        String second = String.format("%tS", date);
        System.out.println(hour + "时" + minute + "分" + second + "秒");

        // 格式化常见的日期时间组合
        String time = String.format("%tc", date);
        String from = String.format("%tF", date);
        System.out.println("全部的时间信息:" + time);
        System.out.println("年-月-日格式:" + from);

        // 常规类型格式化
        String str = String.format("%d", 400 / 2);
        String str2 = String.format("%b", 3 > 5);
        String str3 = String.format("%x", 200);
        System.out.println("400的一半是" + str);
        System.out.println("3>5正确吗?" + str2);
        System.out.println("200的16进制数是" + str3);
    }
}

5.6 使用正则表达式

正则表达式用于判断语句中某一字符是否满足某一格式

正则表达式关键的就是要会写正则表达式

元字符 正则表达式中的写法 意义
. . 代表任意一个字符
\d \\d 代表0~9的任何一个数字
\D \\D 代表任何一个非数字字符
\s \\s 代表空白字符 如'\t' '\n'
\S \\S 代表非空白字符
\w \\w 代表可用作标识符的字符 但不包括"$"
\W \\W 代表不可用于标识符的字符
\p \\p 代表小写字母a~z
\p \\p 代表大写字母A~Z
\p \\p ASCII字符
\p \\p 字母字符
\p \\p 十进制数字 0~9
\p \\p 数字或字母字符
\p \\p 标点符号 !"#$%'()*+,-./:;<=>?@[\]^_`{|}~
\p \\p 可见字符 [\p{Alnum}\p{Punct}]
\p \\p 可打印字符 [\p{Graph}\x20]
\p \\p 空格或制表符 [\t]
\p \\p 控制字符 [\x00-\x1F\x7F]
  • 如果想在正则表达式中单纯表达'.' 需要加转义字符''

  • ^ 匹配开头 $ 匹配结尾

  • 可以使用方括号括起来若干字符来表示一个元字符 该元字符可以代表方括号中任何一个字符

    eg [abc]4 即表示 a4 or b4 or c4 这三个都可以被匹配到

    • [^456] 456以外的任何字符
    • [a-r] a-r中任一字符
    • [a-zA-Z] 任一英文字母
    • [a-e[g-z]] a-e或g-z中的任一字符 并运算
    • [a-o&&[def]] d e f 交运算
    • [a-d&&[^bc]] a d 差运算
限定修饰符 意义 实例
0或1次 A?
* 0或多次 A*
+ 一次或多次 A+
正好出现n次 A
至少出现n次 A
出现n~m次 A
^ 该正则表达式匹配的字符串在开头 ^A
$ | 该正则表达式匹配的字符串在结尾 | A$

*格式很可能错了

public class Java5_6 {
    public static void main(String[] args){
        // \\w+: 一次或多次标识符 @ \\w+: 一次或多次标识符
        // (\.\w{2,3})*: .和两三个标识符 这一点主要是识别类似.com .cn .org等 这个组合出现0或多次
        // \.\w{2,3} 最后的.com .cn .org等
        // 这个正则表达式不一定可以匹配所有的邮件地址
        String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
        String str1 = "aaa@";
        String str2 = "aaaaa";
        String str3 = "111@111ffyu.dfg.com";
        if (str1.matches(regex)){
            System.out.println(str1 + "是一个合法的E-mail地址");
        }
        else if (str2.matches(regex)){
            System.out.println(str2 + "是一个合法的E-mail地址");
        }
        else if (str3.matches(regex)){
            System.out.println(str3 + "是一个合法的E-mail地址");
        }
    }
}

5.7 字符串生成器

创建成功的字符串对象 长度是固定的 内容不能被改变和编译

虽然+可以用来附加新字符或者字符串 但是会产生一个新的String实例 会在内存中创建新的字符串对象

J2SE5.0新增了可变的字符序列String-Builder类

新创建的StringBuilder类初始容量是16个字符 如果超过则会自动增长长度

若要使用StringBuilder来输出字符串结果 可以使用toString方法

  • append() 追加 可以接受任何类型的数据 比如int等
  • insert(int offset, arg) 指定位置插入 可以接受任何类型的数据
  • delete(int start, int end) 删除指定位置的字符串
public class Java5_7 {
    public static void main(String[] args) {
        String str = "";
        long starTime = System.currentTimeMillis();
        for (int i=0; i < 10000; i++){
            str = str + i;
        }
        long endTime = System.currentTimeMillis();
        long time = endTime - starTime;
        System.out.println("String消耗时间:" + time);
        StringBuilder builder = new StringBuilder("");
        starTime = System.currentTimeMillis();
        for (int j=0; j < 10000; j++){
            builder.append(j);
        }
        endTime = System.currentTimeMillis();
        time = endTime - starTime;
        // 耗时明显更短
        System.out.println("StringBuilder消耗时间:" + time);
    }
}

5.8 小结 略

5.9 练习

public class Java_Test5_9 {
    public static void main(String[] args) {
        System.out.println("1.使用String类的toUpperCase()和toLowerCase()来实现大小写的转换");
        String s1 = "sidHsoH";
        System.out.println("s1 to upper case: " + s1.toUpperCase());
        System.out.println("s1 to lower case: " + s1.toLowerCase());
        System.out.println("2.分别截取字符串str1和str2的部分内容 如果截取后的两个字串相同,输出‘两个子串相同’,否则输出‘两个子串并不相同’");
        String str1 = "hello world";
        String str2 = "hello world!";
        String substr1 = str1.substring(1);
        String substr2 = str2.substring(1);
        if (substr1.equals(substr2)){
            System.out.println("两个子串相同");
        }
        else {
            System.out.println("两个子串并不相同");
        }
        System.out.println("3.用正则表达式判断字符串text是否为合法的手机号");
        String regex = "^1[3456789]\\d{9}$";
        String tel = "112602260";
        if (tel.matches(regex)){
            System.out.println(tel + "是一个合法的手机号");
        }
        else {
            System.out.println(tel + "不是一个合法的手机号");
        }
        System.out.println("4.使用字符串生成器 将字符串str追加1~10这10个数字");
        StringBuilder str = new StringBuilder("start");
        for (int i=1; i<11; i++){
            str.append(i);
        }
        System.out.println(str);
    }
}