格式化字符串 format() 字符串生成器 正则表达式
格式化字符串 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 | \\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] |
还有其他格式
[^456] 表示除4,5,6之外的任意字符
[a-r] 代表a-r中的任何字母
[a-zA-Z] 代表任何一个字母
限定修饰符
限定修饰符 | 意义 | 实例 |
---|---|---|
? | 0次或1次 | A? |
* | 0次或多次 | A* |
+ | 1次或多次 | A+ |
正好出现n次 | A | |
至少出现n次 | A | |
出现n~m次 | A |
字符串生成器
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("号码输入错误,请按要求重新输入");
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~