JAVA学习笔记12_Java语言基础(正则表达式 )

本文介绍了正则表达式的基本概念与使用方法,包括字符类、数量词、分组等功能,以及如何利用Java中的Date和SimpleDateFormat类进行日期时间的格式化和解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

###14.01_常见对象(正则表达式的概述和简单使用)
A:正则表达式
    * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
    * 作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个限制长度的事情就是正则表达式做的

###14.02_常见对象(字符类演示)

A:字符类

中括号 【】 代表单个字符

    * [abc] a、b 或 c(简单类) 

String regex = "[abc]";					//[]代表单个字符
		System.out.println("a".matches(regex));
		System.out.println("b".matches(regex));
		System.out.println("c".matches(regex));

    * [^abc] 任何字符,除了 a、b 或 c(否定) 

		String regex = "[^abc]";
		System.out.println("a".matches(regex));//false
		System.out.println("b".matches(regex));
		System.out.println("c".matches(regex));
		System.out.println("d".matches(regex));//true
		System.out.println("1".matches(regex));
		System.out.println("%".matches(regex));
		System.out.println("10".matches(regex));		//10代表1字符和0字符,不是单个字符 false

    * [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)

String regex = "[a-zA-Z]";
		System.out.println("a".matches(regex));
		System.out.println("A".matches(regex));
		System.out.println("z".matches(regex));
		System.out.println("Z".matches(regex));
		System.out.println("1".matches(regex));
		System.out.println("%".matches(regex));
    *[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](减去) 

    * [0-9] 0到9的字符都包括


###14.03_常见对象(预定义字符类演示)
A:预定义字符类
         . 任何字符

\d 数字:[0-9] 

String regex = "\\d";					//\代表转义字符,如果想表示\d的话,需要\\d
System.out.println("0".matches(regex));
System.out.println("a".matches(regex));
System.out.println("9".matches(regex));
\D 非数字: [^0-9] 

\s 空白字符:[ \t\n\x0B\f\r] 

String regex = "\\s";
System.out.println(" ".matches(regex));
System.out.println("	".matches(regex)); 				//一个tab键 true
System.out.println("    ".matches(regex)); 				//四个空格 false
\S 非空白字符:[^\s] 
\w 单词字符:[a-zA-Z_0-9] 
\W 非单词字符:[^\w] 
###14.04_常见对象(数量词)
A:Greedy 数量词 
    * X? X,一次或一次也没有
    * X* X,零次或多次
    * X+ X,一次或多次
    * X{n} X,恰好 n 次 
    * X{n,} X,至少 n 次 
    * X{n,m} X,至少 n 次,但是不超过 m 次 
String regex = "[abc]{5,15}";
System.out.println("abcba".matches(regex));
System.out.println("abcbaabcabbabab".matches(regex));
System.out.println("abcb".matches(regex));
System.out.println("abcbaabaabcbaaba".matches(regex));


###14.05_常见对象(正则表达式的分割功能)
A:正则表达式的分割功能
    * String类的功能:public String[] split(String regex)
B:案例演示
String s = "金三胖.郭美美.李dayone";
String[] arr = s.split("\\.");				//通过正则表达式切割字符串
		
for (int i = 0; i < arr.length; i++) {
	System.out.println(arr[i]);
}

结果:

金三胖
郭美美
李dayone



###14.06_常见对象(把给定字符串中的数字排序)
A:案例演示
    * 需求:我有如下一个字符串:”91 27 46 38 50”,请写代码实现最终输出结果是:”27 38 46 50 91”
package com.heima.test;

import java.util.Arrays;

public class Test1 {

	/**
	 * 分析:
	 * 1,将字符串切割成字符串数组
	 * 2,将字符串转换成数字并将其存储在一个等长度的int数组中
	 * 3,排序
	 * 4,将排序后的结果遍历并拼接成一个字符串
	 */
	public static void main(String[] args) {
		String s = "91 27 46 38 50";
		//1,将字符串切割成字符串数组
		String[] sArr = s.split(" ");
		//2,将字符串转换成数字并将其存储在一个等长度的int数组中
		int[] arr = new int[sArr.length];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = Integer.parseInt(sArr[i]); 	//将数字字符串转换成数字
		}
		
		//3,排序
		Arrays.sort(arr);
		
		//4,将排序后的结果遍历并拼接成一个字符串27 38 46 50 91
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < arr.length; i++) {
			if(i == arr.length - 1) {
				sb.append(arr[i]);
			}else {
				sb.append(arr[i] + " ");
			}
		}
		
		System.out.println(sb);
	}

}

###14.07_常见对象(正则表达式的替换功能)
A:正则表达式的替换功能
    * String类的功能:public String replaceAll(String regex,String replacement)
B:案例演示
String s = "wo111ai222heima";
String regex = "\\d";			//   \\d代表的是任意数字
		
String s2 = s.replaceAll(regex, "");
System.out.println(s2);

输出:

woaiheima



###14.08_常见对象(正则表达式的分组功能)
A:正则表达式的分组功能
    * 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组: 

        1     ((A)(B(C))) 
        2     (A 
        3     (B(C)) 
        4     (C) 
    
        组零始终代表整个表达式。
B:案例演示

   

//叠词 快快乐乐,高高兴兴
		String regex = "(.)\\1(.)\\2";					//\\1代表第一组又出现一次	\\2代表第二组又出现一次
		System.out.println("快快乐乐".matches(regex));
		System.out.println("快乐乐乐".matches(regex));
		System.out.println("高高兴兴".matches(regex));
		System.out.println("死啦死啦".matches(regex));
//叠词 死啦死啦,高兴高兴
		String regex2 = "(..)\\1";
		System.out.println("死啦死啦".matches(regex2));
		System.out.println("高兴高兴".matches(regex2));
		System.out.println("快快乐乐".matches(regex2));
String s = "sdqqfgkkkhjppppkl";
String regex = "(.)\\1+";					//+代表第一组出现一次到多次
String[] arr = s.split(regex);

for (int i = 0; i < arr.length; i++) {
	System.out.println(arr[i]);
}		
String s = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
String s2 = s.replaceAll("\\.+", "");//去掉所有的点
String s3 = s2.replaceAll("(.)\\1+", "$1");	//$1代表第一组中的内容
System.out.println(s3);




###14.09_常见对象(Pattern类和Matcher类的概述)
A:Pattern和Matcher的概述
B:模式和匹配器的典型调用顺序
    * 通过JDK提供的API,查看Pattern类的说明

    * 典型的调用顺序是 
    * Pattern p = Pattern.compile("a*b");
    * Matcher m = p.matcher("aaaaab");
    * boolean b = m.matches();
Pattern p = Pattern.compile("a*b");					//获取到正则表达式
Matcher m = p.matcher("aaaaab");					//获取匹配器
boolean b = m.matches();						//看是否能匹配,匹配就返回true		
System.out.println(b);


###14.10_常见对象(正则表达式的获取功能)
A:正则表达式的获取功能
    * Pattern和Matcher的结合使用
B:案例演示
    group之前一定要先找到,也就是先find
String s = "我的手机是18988888888,我曾用过18987654321,还用过18812345678";
String regex = "1[3578]\\d{9}";		
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);				
while(m.find())
	System.out.println(m.group());
}

###14.11_常见对象(Math类概述和方法使用)
A:Math类概述
    * Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。 
B:成员方法
    * public static int abs(int a)
    * public static double ceil(double a)
    * public static double floor(double a)
    * public static int max(int a,int b) min自学
    * public static double pow(double a,double b)
    * public static double random()
    * public static int round(float a) 参数为double的自学
    * public static double sqrt(double a)

###14.12_常见对象(Random类的概述和方法使用)
A:Random类的概述
    * 此类用于产生随机数如果用相同的种子创建两个 Random 实例,
    * 则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。
B:构造方法
    * public Random()
    * public Random(long seed)
C:成员方法
    * public int nextInt()

    * public int nextInt(int n)(重点掌握)

Random r = new Random();	
		
for(int i = 0; i < 10; i++) {
		System.out.println(r.nextInt(100));			//要求掌握,生成在0到n范围内的随机数,包含0不包含n
}


###14.13_常见对象(System类的概述和方法使用)
A:System类的概述
    * System 类包含一些有用的类字段和方法。它不能被实例化。 
B:成员方法

    * public static void gc()

public static void demo1() {
		for(int i = 0; i < 100; i++) {
			new Demo();
			System.gc();						//运行垃圾回收器,相当于呼喊保洁阿姨
		}
	}

}

class Demo {									
	@Override
	public void finalize() {
		System.out.println("垃圾被清扫了");
	}							
	

    * public static void exit(int status)

public static void demo2() {
		System.exit(1);							//非0状态是异常终止,退出jvm
		System.out.println("11111111111");
	}

    * public static long currentTimeMillis()

long start = System.currentTimeMillis();		//1秒等于1000毫秒
		for(int i = 0; i < 1000; i++) {
			System.out.println("*");
		}
		long end = System.currentTimeMillis();			//获取当前时间的毫秒值
		
		System.out.println(end - start);

    * pubiic static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 

int[] src = {11,22,33,44,55};
int[] dest = new int[8];
System.arraycopy(src, 0, dest, 0, src.length);		//将数组内容拷贝

###14.14_常见对象(BigInteger类的概述和方法使用)
A:BigInteger的概述
    * 可以让超过Integer范围内的数据进行运算
B:构造方法
    * public BigInteger(String val)
C:成员方法
    * public BigInteger add(BigInteger val)
    * public BigInteger subtract(BigInteger val)
    * public BigInteger multiply(BigInteger val)
    * public BigInteger divide(BigInteger val)
    * public BigInteger[] divideAndRemainder(BigInteger val)

###14.15_常见对象(BigDecimal类的概述和方法使用)
A:BigDecimal的概述
    * 由于在运算的时候,float类型和double很容易丢失精度
    * 所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal
    * 不可变的、任意精度的有符号十进制数。
B:构造方法
    * public BigDecimal(String val)
C:成员方法
    * public BigDecimal add(BigDecimal augend)
    * public BigDecimal subtract(BigDecimal subtrahend)
    * public BigDecimal multiply(BigDecimal multiplicand)
    * public BigDecimal divide(BigDecimal divisor)


###14.16_常见对象(Date类的概述和方法使用)(掌握)

A:Date类的概述

   Date类的概述是util包下的,不能导入sql包的

    * 类 Date 表示特定的瞬间,精确到毫秒。 
B:构造方法
    * public Date()
    * public Date(long date)
C:成员方法
    * public long getTime()
    * public void setTime(long time)
Date d1 = new Date();					//如果没有传参数代表的是当前时间
System.out.println(d1);
		
Date d2 = new Date(0);					//如果构造方法中参数传为0代表的是1970年1月1日
System.out.println(d2);					//通过毫秒值创建时间对象
Date d1 = new Date();	
System.out.println(d1.getTime());				//通过时间对象获取毫秒值
System.out.println(System.currentTimeMillis());	//通过系统类的方法获取当前时间毫秒值
Date d1 = new Date();	
d1.setTime(1000);								//设置毫秒值,改变时间对象
System.out.println(d1);


###14.17_常见对象(SimpleDateFormat类实现日期和字符串的相互转换)(掌握)
A:DateFormat类的概述
    * DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。是抽象类,不能实例化,所以使用其子类SimpleDateFormat
B:SimpleDateFormat构造方法
    * public SimpleDateFormat()
    * public SimpleDateFormat(String pattern)
C:成员方法
    * public final String format(Date date)
    * public Date parse(String source)

Date d = new Date();				//获取当前时间对象
SimpleDateFormat sdf = new SimpleDateFormat();	//创建日期格式化类对象
System.out.println(sdf.format(d));	 	//18-3-30 下午6:46
Date d = new Date();							//获取当前时间对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");     //创建日期格式化类对象
System.out.println(sdf.format(d));				        //将日期对象转换为字符串  2018/03/30 18:48:58
String str = "2000年08月08日 08:08:08";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = sdf.parse(str);						//将时间字符串转换成日期对象
System.out.println(d);



###14.18_常见对象(你来到这个世界多少天案例)(掌握)
A:案例演示

    * 需求:算一下你来到这个世界多少天?

                //1,将生日字符串和今天字符串存在String类型的变量中
		String birthday = "1983年07月08日";
		String today = "2088年6月6日";
		//2,定义日期格式化对象
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
		//3,将日期字符串转换成日期对象
		Date d1 = sdf.parse(birthday);
		Date d2 = sdf.parse(today);
		//4,通过日期对象后期时间毫秒值
		long time = d2.getTime() - d1.getTime();
		//5,将两个时间毫秒值相减除以1000,再除以60,再除以60,再除以24得到天
		System.out.println(time / 1000 / 60 / 60 / 24 );


###14.19_常见对象(Calendar类的概述和获取日期的方法)(掌握)
A:Calendar类的概述
    * Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
B:成员方法
    * public static Calendar getInstance()
    * public int get(int field)

import java.util.Calendar;

	public static void demo1() {
		Calendar c = Calendar.getInstance();			//父类引用指向子类对象
		System.out.println(c.get(Calendar.YEAR));		//通过字段获取年
		System.out.println(c.get(Calendar.MONTH));		//通过字段后期月,但是月是从0开始编号的
		System.out.println(c.get(Calendar.DAY_OF_MONTH));//月中的第几天
		System.out.println(c.get(Calendar.DAY_OF_WEEK));//周日是第一天,周六是最后一天
		
		System.out.println(c.get(Calendar.YEAR) + "年" + getNum((c.get(Calendar.MONTH)+1)) 
				+ "月" + getNum(c.get(Calendar.DAY_OF_MONTH)) + "日" + getWeek(c.get(Calendar.DAY_OF_WEEK)));
	}
	
	/*
	 * 将星期存储表中进行查表
	 * 1,返回值类型String
	 * 2,参数列表int week
	 */
	
	public static String getWeek(int week) {
		String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};	
		return arr[week];
	}
	
	/*
	 * 如果是个数数字前面补0
	 * 1,返回值类型String类型
	 * 2,参数列表,int num
	 */
	public static String getNum(int num) {
		return num > 9 ? "" + num : "0" + num;
	}
}



###14.20_常见对象(Calendar类的add()和set()方法)(掌握)
A:成员方法
    * public void add(int field,int amount)
    * public final void set(int year,int month,int date)


###14.21_常见对象(如何获取任意年份是平年还是闰年)(掌握)
A:案例演示

    * 需求:键盘录入任意一个年份,判断该年是闰年还是平年

            
                public static void main(String[] args) {
		    Scanner sc = new Scanner(System.in);
		    System.out.println("请输入年份,判断该年份是闰年还是平年:");
		    String line = sc.nextLine();				//录入数字字符串
		    int year = Integer.parseInt(line);		        	//将数字字符串转换成数字
		    boolean b = getYear(year);
		    System.out.println(b);
	        }

	private static boolean getYear(int year) {
		//2,创建Calendar c = Calendar.getInstance();
		Calendar c = Calendar.getInstance();
		//设置为那一年的3月1日
		c.set(year, 2, 1);
		//将日向前减去1
		c.add(Calendar.DAY_OF_MONTH, -1);
		//判断是否是29天
		return c.get(Calendar.DAY_OF_MONTH) == 29;
	}



CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
内存分区情况的分析是嵌入式系统开发中的一个重要环节,特别是在资源有限的MCU(微控制器)环境中。标题提到的工具是一款专为分析Linux环境下的`gcc-map`文件设计的工具,这类文件在编译过程结束后生成,包含了程序在目标设备内存中的布局信息。这个工具可以帮助开发者理解程序在RAM、ROM以及FLASH等存储区域的占用情况,从而进行优化。 `gcc-map`文件通常包含以下关键信息: 1. **符号表**:列出所有定义的全局和静态变量、函数以及其他符号,包括它们的地址和大小。 2. **节区分配**:显示每个代码和数据节区在内存中的位置,比如.text(代码)、.data(已初始化数据)、.bss(未初始化数据)等。 3. **内存汇总**:总览所有节区的大小,有助于评估程序的整体内存需求。 4. **重定位信息**:显示了代码和数据如何在目标地址空间中定位。 该分析工具可能提供以下功能: 1. **可视化展示**:将内存分配以图形化方式呈现,便于直观理解。 2. **详细报告**:生成详细的分析报告,列出每个符号的大小和位置。 3. **比较功能**:对比不同编译版本或配置的`map`文件,查看内存使用的变化。 4. **统计分析**:计算各种内存区域的使用率,帮助识别潜在的优化点。 5. **自定义过滤**:允许用户根据需要筛选和关注特定的符号或节区。 虽然在MCU环境中,Keil IDE自带的工具可能更方便,因为它们通常针对特定的MCU型号进行了优化,提供更加细致的硬件相关分析。然而,对于通用的Linux系统或跨平台项目,这款基于`gcc-map`的分析工具提供了更广泛的适用性。 在实际使用过程中,开发者可以利用这款工具来: - **优化内存使用**:通过分析哪些函数或数据占用过多的内存,进行代码重构或调整链接器脚本以减小体积。 - **排查内存泄漏**:结合其他工具,比如动态内存检测工具,查找可能导致内存泄漏的部分。 - **性能调优**:了解代码执行时的内存分布,有助于提高运行效率。 - **满足资源限制**:在嵌入式系统中,确保程序能在有限的内存空间内运行。 总结来说,`gcc-amap`这样的工具对于深入理解程序的内存布局和资源消耗至关重要,它能帮助开发者做出更明智的决策,优化代码以适应不同的硬件环境。在处理`map`文件时,开发者不仅能获取到程序的内存占用情况,还能进一步挖掘出可能的优化空间,从而提升系统的整体性能和效率。
本次基于签名识别的合同管理系统的设计与实现其主要的使用角色是两个,一个是系统的管理员,一个签名识别使用的用户前台,用户主要是进行和同上传让母后进行签名的识别操作,管理员则是主要对系统用户的管理以及合同管理签名的实现等等: (1)登陆注册功能:用户在想要使用这个系统时,应该有一个注册的界面,让用户可以注册,然后还需要一个登陆的页面模块,让用户登陆后可以进行合同的上传和签名识别的操作。 (2)用户资料修改:用户在进入系统后应该可以对自己的资料进行一定的更正,因为注册时可能会填写了错误的信息,此时就需要登陆后进行二次的修改信息。 (3)签名对比功能:用户在进入系统后应该可以对自己上传的一些合同的签名信息进行对比,通过对神经网络的识别以及签名的信息识别,从而可以去识别这些合同上面的签名信息是不是正确的,更好的进行管理工作。 (4)用户管理功能:系统用户在通过登录页面登陆进入系统之后,应该可以对系统中的用户进行一个管理,这其中便包括了对用户的账号信息管理,可以添加和修改账号信息。 (5)合同管理功能:系统用户在通过登录页面登陆进入系统之后,可以对新疆阿克苏温宿县克孜勒政府土地合同管理,这个功能是主要就是对这个地区的合同进行管理操作,可以查看合同的一些信息以及合同的内容等等操作。 (6)合同和签名对比功能,系统用户在通过登录页面登陆进入系统之后,可以对新疆阿克苏温宿县克孜勒政府土地合同管理并且进行签名的识别,可以对自己的签名情况对比进行查看,也具有一个统计的功能,可以让用户查看识别的结果和情况。 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值