首页 > 技术文章 > 格式化字符串 format() 字符串生成器 正则表达式

valder- 2021-08-13 18:33 原文

格式化字符串 format()

//有的也可以表示    更简便
Date date = new Date();
System.out.printf("%tc",date);

格式化日期

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+"年");
System.out.println("现在是"+month);
System.out.println("今天是"+day+"号");//输出运行时的日期

常用日期格式转换符

转换符 说明 示例
%te 一个月中的某一天(1~31) 2,12,22
%tb 指定语言环境的月份简称 Feb(英文),二月(中文)
%tB 指定语言环境的月份全称 February(英文),二月(中文)
%tA 指定语言环境的星期全称 Monday,星期一
%ta 指定语言环境的星期简称 Mon,星期一
%tc 包括全部日期和时间信息 星期四 八月 12 16:09:51 CST 2021
%tY 四位年份 2021
%tj 一年中的第几天(1~366) 065
%tm 月份 08
%td 一个月中的第几天(1~31) 23
%ty 两位年份 21

时间格式化

Date date = new Date();
String hour=String.format("%tH",date);
String minute=String.format("%tM",date);
String second=String.format("%tS",date);
System.out.println(hour);
System.out.println(minute);
System.out.println(second);

常用时间格式转换符

转换符 说明 示例
%tH 2位数字的24时制的小时(00~23) 16
%tI(大写i) 2位数字的12时制的小时(01~12) 04
%tk 2位数字的24时制的小时(0~23) 5
%tl(小写L) 2位数字的12时制的小时(1~12) 10
%tM 2位数字的分钟数(00~59) 56
%tS 2位数字的分钟数(00~60) 23
%tL 3位数字的毫秒数(000~999) 990
%tN 9位数字的毫秒数(000000000~999999999) 564892548
%tp 指定语言环境下上午或下午的标记 下午,pm
%tz 相对于GMT RFC 82格式的数字时区偏移量 +0800
%tZ 时区缩写形式的字符串 CST
%ts 1970-01-01 00:00:00至现在经过的秒数
%t 1970-01-01 00:00:00至现在经过的毫秒数

常见的日期与时间组合格式

转换符 说明 示例
%tF "年-月-日" 4位年份 2021-08-12
%tD "月/日/年" 2位年份 08/12/21
%tc 全部日期和时间信息 星期四 八月 12 16:39:43 CST 2021
%tr "时:分:秒 PM(AM)" 12时制 04:41:43 下午
%tT "时:分:秒" 24时制 16:41:43
%tR "时:分" 24时制 16:41

常规类型格式化

String s1=String.format("%d",400/2);
String s2=String.format("%b",3>5);
String s3=String.format("%x",200);

System.out.println(s1);//200
System.out.println(s2);//false
System.out.println(s3);//c8

常规转换符

转换符 说明 示例
%b、%B 结果被格式化为布尔类型 true,false
%h、%H 结果被格式化为散列码 ?
%s、%S 结果被格式化为字符串类型 "abcd"
%c、%C 结果被格式化为字符类型 'a'
%d 结果被格式化为十进制整数 40
%o 结果被格式化为八进制整数 11
%x、%X 结果被格式化为十六进制整数 c8
%e 结果被格式化为用计算机科学记数法表示的十进制数
%a 结果被格式化为带有效位数和指数的十六进制浮点值
%n 结果为特定于平台的行分隔符
%% 结果为字面值“%” %

正则表达式

//定义正则表达式,也就是E-mail地址格式
String regex="\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
//定义需要验证的
String s1="aaa@";
String s2="3289027951@qq.com";
String s3="1111@111ffyu.dfg.com";
//判断是否匹配
if (s1.matches(regex)){
    System.out.println(s1+"是一个合法的E-mail地址格式");
}
if (s2.matches(regex)){
    System.out.println(s2+"是一个合法的E-mail地址格式");
}
if (s3.matches(regex)){
    System.out.println(s3+"是一个合法的E-mail地址格式");
}

//输出s1,s2都是合法的
/*合法E-mail地址格式为  X@X.com.cn
"\\w"匹配任意字符
"+"表示字符可出现一次或多次
(\.\w{2,3})*表示像.com类的字符串可以出现多次(包括0)
\.\w{2,3}表示最后的像.cn之类的结尾字符串
 */

用户设置密码模拟

public static void main(String[] args) {
    while (true){                  //循环直至密码输入符合要求
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入密码");
    String str=sc.next();

    //检查密码
    if (check(str)){
        System.out.println("此密码符合要求");
        break;//非常重要,停止运行
    }else{
        System.out.println("请按要求重新设置密码");
    }
    }
}

public static boolean check(String str){
    //判断是否有其他符号,并判断密码长度是否正常
    if (!str.matches("[a-zA-Z0-9]{8,20}"))
        return false;

    //记录出现了几种字符
    int count=0;

    if (str.matches(".*[a-z].*"))
        count++;
    if (str.matches(".*[A-Z].*"))
        count++;
    if (str.matches(".*[0-9].*"))
        count++;
    if (count<2){
        System.out.println("密码错误");
        return false;
    }else
        return true;
}

正则表达式中的元字符

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

还有其他格式

[^456] 表示除4,5,6之外的任意字符

[a-r] 代表a-r中的任何字母

[a-zA-Z] 代表任何一个字母

限定修饰符

限定修饰符 意义 实例
0次或1次 A?
* 0次或多次 A*
+ 1次或多次 A+
{n} 正好出现n次 A{2}
{n,} 至少出现n次 A{3,}
{n,m} 出现n~m次 A{2,6}

字符串生成器

append()

向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的数据

append(content)

content: 表示要追加到字符串生成器中的内容,可以是任何类型的数据或其他对象

StringBuilder bf = new StringBuilder("hello");
bf.append(",world");//追加world   
System.out.println(bf);//hello,world

insert()

向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串中插入int,float,char,boolean等基本数据类型的数据或其他对象

insert(int offset arg)

offset: 字符串生成器的位置

arg:将要插入至字符串生成器的位置。可以是任何数据类型的数据或其他对象

StringBuilder bf = new StringBuilder("hllo");
bf.insert(1,"e");//在数组下标为0后插入e
System.out.println(bf);//hello

delete()

移除此序列的子字符串的字符。该子字符从指定的star出开始,一直到索引end-1处的字符。若不存在这种字符,则一直到序列尾部。若star等于end,则不发生任何更改

delete(int star,int end)

star:将要删除的字符串的起点位置

end:将要删除的字符串的终点位置

StringBuilder bf = new StringBuilder("hello,my godworld");
bf.delete(6,12);//移除数组下标为6(包括6)到12(不包括12)  (my god)
System.out.println(bf);//hello,world

练习:屏蔽手机号码中间四位

public static void main(String[] args){
        while(true){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入11位手机号");
        String num=sc.next();
        if (num.length()==11){
            StringBuilder nums = new StringBuilder(num);
            nums.delete(3,7);//包括数组下标为3,不包括7
            nums.insert(3,"****");//在数组下标为2后加
            System.out.println(nums);
            break;
        }else{
            System.out.println("号码输入错误,请按要求重新输入");
        }
        }
    }

推荐阅读