admin管理员组文章数量:1579085
文章目录
- Day14
- 一、 正则表达式
- 二、Pattern类 及 Matcher
- 三、 日期时间类
- Date类
- SimpleDateFormat类
- Calendar类
- 四、 Math类
- 五、静态导入(了解)
- 六、Random类
- 七、 System类
- 八、Runtime类
- 九、BigInteger类和BigDecemal
Day14
一、 正则表达式
含义:用来描述或者匹配一系列符合某个语句规则的字符串
字符 | |
---|---|
x | 字符 x |
// | 反斜线字符 |
/t | 制表符 ('/u0009' ) |
/n | 新行(换行)符 ('/u000A' ) |
/r | 回车符 ('/u000D' ) |
/e | 转义符 ('/u001B' ) |
. | 任意字符 |
字符类 | |
---|---|
[abc] | a 、b 或 c (简单类) |
[^abc] | 任何字符,除了 a 、b 或 c (否定) |
[a-zA-Z] | a 到 z 或 A 到 Z ,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p :[a-dm-p] (并集) |
[a-z&&[def]] | d 、e 或 f (交集) |
[a-z&&[^bc]] | a 到 z ,除了 b 和 c :[ad-z] (减去) |
[a-z&&[^m-p]] | a 到 z ,而非 m 到 p :[a-lq-z] (减去) |
预定义字符类 | |
---|---|
. | 任何字符(与行结束符可能匹配也可能不匹配) |
/d | 数字:[0-9] |
/D | 非数字: [^0-9] |
/s | 空白字符:[ /t/n/x0B/f/r] |
/S | 非空白字符:[^/s] |
/w | 单词字符:[a-zA-Z_0-9] |
/W | 非单词字符:[^/w] |
边界匹配器 | |
---|---|
^ | 行的开头 |
$ | 行的结尾 |
/b | 单词边界 |
/B | 非单词边界 |
/A | 输入的开头 |
/G | 上一个匹配的结尾 |
/Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
/z | 输入的结尾 |
Greedy 数量词 | |
---|---|
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{ n} | X,恰好 n 次 |
X{ n,} | X,至少 n 次 |
X{ n, m} | X,至少 n 次,但是不超过 m 次 |
Reluctant 数量词 | |
---|---|
X?? | X,一次或一次也没有 |
X*? | X,零次或多次 |
X+? | X,一次或多次 |
X{ n}? | X,恰好 n 次 |
X{ n,}? | X,至少 n 次 |
X{ n, m}? | X,至少 n 次,但是不超过 m 次 |
Possessive 数量词 | |
---|---|
X?+ | X,一次或一次也没有 |
X*+ | X,零次或多次 |
X++ | X,一次或多次 |
X{ n}+ | X,恰好 n 次 |
X{ n,}+ | X,至少 n 次 |
X{ n, m}+ | X,至少 n 次,但是不超过 m 次 |
Logical 运算符 | |
---|---|
XY | X 后跟 Y |
X| Y | X 或 Y |
( X) | X,作为捕获组 |
字符类运算符的优先级如下所示,按从最高到最低的顺序排列:
1 | 字面值转义 | /x |
---|---|---|
2 | 分组 | [...] |
3 | 范围 | a-z |
4 | 并集 | [a-e][i-u] |
5 | 交集 | [a-z&&[aeiou]] |
案例:把一个字符串中带电话号码替换成130****1111
String str = "小红13012341111,小绿15112342222";
String regex = "(1\\d{2})(\\d{4})(\\d{4})";
str = str.replaceAll(regex, "$1****$3");
System.out.println(str);
二、Pattern类 及 Matcher
Pattern:代表正则表达式的匹配模式
Matcher:提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持
案例1:校验QQ邮箱
String str = "1445584980@qq";
String regex = "\\d{5,11}@qq\\";
//boolean matches = str.matches(regex);
**boolean** matches = Pattern.*matches*(regex , str);
System.***out\***.println(matches);
案例2:分隔路径
String str = "C:\\资源\\日韩\\波多野结衣.avi";
String regex = ":?\\\\";
//String[] split = str.split(regex);
Pattern pattern = Pattern.*compile*(regex);//创建匹配模式对象
String[] split = pattern.split(str);
**for** (String s : split) {
System.***out\***.println(s);
}
案例3:Pattern+Matcher 找到前端代码中的图片路径
String str = "<img src='hhy/aaa.jpg'/><div><div/> <input type='image' src='submit.gif' /><img src='bbb.jpg'/>";
String regex = "<img\\b[^>]*\\bsrc\\b\\s*=\\s*('|\")?([^'\"\n\r\f>]+(\\.jpg|\\.bmp|\\.eps|\\.gif|\\.mif|\\.miff|\\.png|\\.tif|\\.tiff|\\.svg|\\.wmf|\\.jpe|\\.jpeg|\\.dib|\\.ico|\\.tga|\\.cut|\\.pic)\\b)[^>]*>";
Pattern pattern = Pattern.compile(regex);//创建匹配模式对象
Matcher matcher = pattern.matcher(str);//获取匹配结果
// System.out.println("在字符串中是否整个匹配:" + matcher.matches());
// System.out.println("在字符串中是否开头就匹配:" + matcher.lookingAt());
// System.out.println("在字符串中是否有包含匹配:" + matcher.find());
while(matcher.find()){
System.out.println(matcher.group()); //matcher.group(2)-->获取正则表达式里第二个括号(组)里的内容
System.out.print("start:"+matcher.start());
System.out.println(" end:"+matcher.end());
}
**总结:**Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matches(String regex,CharSequence input)一种最基础最简单的匹配。
三、 日期时间类
Date类
java.util.Date类表示特定的瞬间,精确到毫秒。
Date date1 = new Date();
//星期 月份 日 时:分:秒 时区 年份
//Thu Jan 21 10:41:31 CST 2021
System.out.println(date1);
//自1970年1月1日0:0:0 往后退1000毫秒
Date date2 = new Date(1000);
System.out.println(date2);
SimpleDateFormat类
将显示的日期信息格式化
//创建格式化日期类的对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//将Date对象 格式化 字符串
String format = sdf.format(new Date());
System.out.println(format);
//将字符串 解析成 Date对象
Date date = sdf.parse("2021年01月21日 10:61:57");
System.out.println(date);
Calendar类
Calendar类(日历)是一个抽象基类,主要用于完成日期字段之间相互操作的功能。即可以设置和获取日期数据的特定部分。
//获取日历类的对象
Calendar c = Calendar.getInstance();
//获取对应的数据
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH)+1;
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
System.out.println(year);
System.out.println(month);
System.out.println(day);
System.out.println(hour);
System.out.println(minute);
System.out.println(second);
四、 Math类
Math 类提供了一序列基本数学运算和几何函数的方法。
Math类是final类,并且它的所有成员变量和成员方法都是静态的。
System.out.println("求平法:" + Math.pow(3, 2));
System.out.println("求平法根:" + Math.sqrt(9));
System.out.println("求绝对值:" + Math.abs(-100));
System.out.println("向下取整:(地板)" + Math.floor(1.9));
System.out.println("向上取整:(天花板)" + Math.ceil(1.1));
System.out.println("最大值:" + Math.max(10, 20));
System.out.println("最小值:" + Math.min(10, 20));
System.out.println("四舍五入:" + Math.round(1.4));
System.out.println("获取随机数(0包含~1不包含):" + Math.random());
获取 1~100的随机数
System.out.println("获取随机数(1~100):" + ((int)(Math.random()*100)+1));
面试题:abs可能出现负数吗?
能
System.out.println(Math.abs(Integer.MAX_VALUE+1));
五、静态导入(了解)
当使用一个类里面的静态方法或者静态变量时,每次都需要写类名。如果不想写类名,想直接写方法名或者变量名,则可以考虑使用静态导入
语法:import static 包名.类名.*; //导入该类下的所有静态方法和常量
例如:import static java.lang.Math.*; //导入Math下的所有方法和变量(包括常量)
则代码中可以直接使用方面和变量名,而不需要前缀Math
如:max(3,4);
六、Random类
-
创建Random类对象
此类用于生成随机数:
Random(); 创建一个新的随机数生成器
Random(long seed);种子数(重点理解工作原理,什么是伪随机数)
-
随机类 - 常用方法
//创建随机类的对象
Random ran = new Random();
System.out.println("随机出int数字:" + ran.nextInt());
System.out.println("随机出int数字:" + ran.nextInt(10));//随机出0包含~10不包含
System.out.println("随机出double数字:" + ran.nextDouble());
System.out.println("随机出boolean数据:" + ran.nextBoolean());
- 需求:点名器
String[] names = {"杨晨","陈希","邓静涵","王永琪"};
Random ran = new Random();
int index = ran.nextInt(names.length);
System.out.println(names[index]);
-
理解随机类的种子数
种子数固定,随机出的值也是固定的
Random ran = new Random(1000);
System.out.println(ran.nextInt(10));
MyRandom myRandom = new MyRandom(1000);
System.out.println(myRandom.nextInt(10));
七、 System类
Java程序的运行平台
1、 System类提供了一些静态属性和方法,允许通过类名直接调用。
2、 System类提供了代表标准输入、标准输出、错误输出的类属性。
System类提供了一些静态方法用于访问环境变量、系统属性的方法。
-
System静态属性
//获取系统标准的输入流(方向:控制台->程序) InputStream in = System.in; Scanner scan = new Scanner(in); String str = scan.next(); scan.close(); //打印流(系统标准的输出流)(方向:程序->控制台) // PrintStream out = System.out; // out.println(str); //打印流(系统标准的错误输出流)(方向:程序->控制台) PrintStream err = System.err; err.println(str);
-
研究System.out 和 System.err
结论:
System.out 和 System.err 是两个线程,哪个线程抢到CPU资源
哪个线程就运行,所以多线程的程序随机性很强System.out.println("小明"); System.err.println("小红"); System.out.println("小强");
-
System的方法
-
public static void exit(int status) 退出当前虚拟机
-
public static long currentTimeMillis() 获得当前系统的毫秒值(与1970 年 1 月 1 日午夜之间的时间差)–测试程序的消耗时间
-
public static Properties getProperties() 获得当前的所有系统属性
-
public static String getProperty(String key) 获得指定键的系统属性
-
public static void setIn(InputStream in) 输入重定向
-
public static void setOut(PrintStream out) 输出重定向
-
public static void setErr(PrintStream err) 错误重定向
-
public static void arraycopy([Object](mk:@MSITStore:C:\Users\hehanyu\Desktop\jdk api 1.8_google.CHM::/java/lang/Object.html) src,int srcPos, [Object](mk:@MSITStore:C:\Users\hehanyu\Desktop\jdk api 1.8_google.CHM::/java/lang/Object.html) dest, int destPos, int length)拷贝数组
-
//退出当前虚拟机
//System.exit(0);
//获取系统参数
Properties properties = System.getProperties();
System.out.println(properties);
//获取指定键上的值
String value = System.getProperty("os.name","默认值");
System.out.println(value);
八、Runtime类
Runtime代表Java程序的运行时环境,可以通过 getRuntime 方法获取当前运行时。
应用程序不能自己创建Runtime对象,可以通过Runtime的静态方法getRuntime()获得Runtime对象。
Runtime类可以访问jvm的相关信息,如处理器数量,内存信息等
//获取到运行环境类
Runtime run = Runtime.getRuntime();
System.out.println("获取最大内存量(字节):" + run.maxMemory());
System.out.println("获取闲置内存量(字节):" + run.freeMemory());
System.out.println("获取处理数:" + run.availableProcessors());
* 消耗内存可能负数的情况吗?
* 有可能,因为java的垃圾回收器会时时监听有没有没用的对象或变量,如果及时回收了,那么endMemory有可能比startMemory还更大
九、BigInteger类和BigDecemal
整数类型的大数值运算类
BigInteger big1 = new BigInteger("20000000000000000000000000000000");
BigInteger big2 = new BigInteger("10000000000000000000000000000000");
System.out.println("加法:" + big1.add(big2));
System.out.println("减法:" + big1.subtract(big2));
System.out.println("乘法:" + big1.multiply(big2));
System.out.println("除法:" + big1.divide(big2));
小数类型的大数值运算
BigDecimal big1 = new BigDecimal("0.5");
BigDecimal big2 = new BigDecimal("0.4");
System.out.println("加法:" + big1.add(big2));
System.out.println("减法:" + big1.subtract(big2));
System.out.println("乘法:" + big1.multiply(big2));
System.out.println("除法:" + big1.divide(big2));
BigDecimal big1 = new BigDecimal("10");
BigDecimal big2 = new BigDecimal("3");
System.out.println("除法:" + big1.divide(big2, 2, BigDecimal.ROUND_HALF_UP));
理解BigInteger
MyBigInteger big1 = new MyBigInteger("500000050");
MyBigInteger big2 = new MyBigInteger("500000050");
System.out.println("加法:" + big1.add(big2));
public class MyBigInteger {
private String value;
public MyBigInteger(String value) {
this.value = value;
}
public MyBigInteger add(MyBigInteger big){
//转换为字符数组
char[] v1 = this.value.toCharArray();
char[] v2 = big.value.toCharArray();
//获取最后的下标
int index1 = v1.length-1;
int index2 = v2.length-1;
int num = 0;//进位
StringBuilder sb = new StringBuilder();
while(index1 >= 0 || index2 >= 0){
int num1 = 0;
int num2 = 0;
if(index1 >= 0){
num1 = Integer.parseInt(String.valueOf(v1[index1]));
}
if(index2 >= 0){
num2 = Integer.parseInt(String.valueOf(v2[index2]));
}
int result = num1 + num2 + num;
if(result >= 10){
num = 1;
result = result%10;
}else{
num = 0;
}
index1--;
index2--;
sb.append(result);
}
if(num == 1){
sb.append(1);
}
sb.reverse();//反转
return new MyBigInteger(sb.toString());
}
@Override
public String toString() {
return value;
}
}
版权声明:本文标题:Day14-正则表达式及常用类 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1727847908a1133310.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论