黑马程序员 -- Java基础学习(10)

------- android培训java培训、期待与您交流! ----------


正则表达式

符合一定规则的表达式
  作用:操作字符串
  特点:用于一些特定的符号来表示一些代码操作,简化书写
  好处:可以简化对字符串的复杂操作。
  弊端:符号定义越多,正则越长,阅读性越差。
例子:对QQ号码进行校验,要求:5~15  0不能开头,只能是数字
  用String类的方法实现,代码比较复杂
  用matches(regex)
  String regex = “[1-9][0-9]{4,14}”;

具体操作功能:

	匹配Stringboolean matches(String regEx) 用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false
		[abc] 匹配一个字符,是abc其中一个
		  [a-z] 小写字母
		  [^abc] abc
		  [a-zA-Z] 英文字母
		  . 任意字符
		  \\d 0-9数字 - 记得前面加上\转义
		  \\D 非数字
		  \\s 空白字符
		  \\w 单词字符
		  \\b 单词边界
		  * 0个或多个
		  + 1个或多个
		  ? 0个或1		  {,} 次数范围
		QQ号:[1-9]\\d{4, 14}
		手机号:13xxxx, 15xxx, 18xxx -> 1[358]\\d{9}
	切割:String[] split(String regEx) -> splitDemo()
		注意.表示的是任意字符,要表示点号得写成\\.
		  c:\\abc\\a.txt -> \\\\
		splitDemo("erkktyqqquizzzzzo","(.)\\1+");
		  按照叠词完成切割
		  为了可以让规则的结果被重用,可以将规则封装成一个组,用()表示,组的出现都有编号,从1开始
		  想要使用已有的组可以通过\n(n就是组的编号)的形式来获取
		  数有几组,看组号:看左括号 ((())())
	替换:String replaceAll(regEx, str)
		"wer1389980000ty1234564uiod234345675f”.replaceAll(“\\d{5,}, “#”);
		  将字符串中的数组替换成#
		如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组
		  “erkktyqqquizzzzzo”.replaceAll(“(.)\\1+”, “$1”); 将重叠的字符替换成单个字母
	获取:将字符串中符合规则的字串取出
		1. 将正则表达式封装成对象 Pattern -> java.util.regex.*
		  Pattern p = Pattern.compile(reg);
		2. 让正则对象和要操作的字符串相关联,获取匹配器对象
		  Matcher m = p.matcher(str);
		  m.matches(); 返回truefalse
		  其实String类中的matches方法,用的就是PatternMatcher对象来完成的,只不过被String的方法封装后,用起来较为简单,但是功能却单一
		3. 关联后,获取正则匹配引擎
		4. 通过引擎对符合规则的子串进行操作,比如取出
		  m.find() -> 将规则作用到字符串上,并进行符合规则的子串查找
		  m.group() -> 获取匹配后的结果
		  用循环表示:
		  while(m.find()) {
			  System.out.println(m.group());
			  System.out.println(m.start()+"...."+m.end());  //找到索引位置,包含头不包含尾
		  }
		  注意matchesfind方法都会改变查找索引位置

练习

	  RegTest.java
	选择功能的思路
	  1. 如果只想知道该字符是否对是错:匹配。
	  2. 想要将已有的字符串变成另一个字符串:替换。
	  3. 想要按照自定的方式将字符串变成多个字符串:切割。获取规则以外的子串。
	  4. 想要拿到符合需求的字符串子串:获取。获取符合规则的子串。
	将已有字符串变成另一个字符串。使用 替换功能。
	  1. 可以先将 . 去掉。
	  2. 在将多个重复的内容变成单个内容。
	192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
	  将ip地址进行地址段顺序的排序
	  思路:还按照字符串自然顺序,只要让它们每一段都是3位即可。
	  1. 按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
	  2. 将每一段只保留3位。这样,所有的ip地址都是每一段3位。
	  用TreeSet进行排序
	  • 掌握:对邮件地址进行校验
	  较为精确的匹配:[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+
	  模糊的匹配:\\w+@\\w+(\\.\\w+)+  比如 1@1.1
	网页爬虫 RegexTest2.java

设计模式

	解决某一类问题最行之有效的方法
	  java中有23种

单例设计模式

	  一个类在内存中只存在一个对象
	  SingleDemo.java    SingleDemo2.java
	1. 为了避免其他程序建立过多个该类对象,先禁止其他程序建立该类对象
	  2. 为了让其他程序可以访问到该类对象,在本类中自定义一个对象
	  3. 为了方便其他程序访问自定义的对象,对外提供一些访问方式
	1. 将构造函数私有化
	  2. 在类中创建一个本类对象 private static (可以加final)
	  3.提供一个方法获取该对象 getInstance() static
	 两种写法(见程序)
		饿汉式:开发一般用该写法
		  Single类一进内存对象就已经初始化
		  
		懒汉式:对象的延时加载 (面试)
		  	• Single类进内存是对象还没有存在,只有调用了getInstance方法时才建立
			可能会建立多个对象:用synchronized,会降低效率
			  解决方法见SingleDemo2.java
			  if (s== null) {   //只要初始化完,就不用判断同步了,可以提高效率
				  synchronized(Single.class) {
					  if(s==null) {
						  s = new Single();
					  }
				  }
			  }

模板设计模式

	  TemplateDemo.java
	currentTimeMillis()
	定义功能时,只有一部分功能是确定的,而确定的部分在使用不确定的部分
	  此时将不确定的部分暴露出去,由子类来完成
	被复写的方法不一定是抽象的,可以有默认的功能

装饰设计模式

	  PersonDemo.java
	当想要对已有的对象进行功能增强时,可以定义一个类将已有对象传入,基于已有对象的功能提供加强的功能
	  自定义的类称为装饰类
	在构造函数中传入要增强的类对象
	装饰和继承的区别    装饰和继承.java
		类的体系:臃肿
		  MyReader
			  MyTextReader
				  MyBufferedTextReader
			  MyMediaReader
				  MyBufferedMediaReader
			  MyDataReader
				  MyBufferedDataReader
		class MyBufferedReader {
			  MyBufferedReader(MyTextReader mtr) {}
			  MyBufferedReader(MyMediaReader mmr) {}
			  …
		  }
		  该类扩展性差
		找到参数的共同类型,通过多态的形式提高扩展性
		  class MyBufferedReader extends MyReader {
			  MyBufferedReader(MyReaer mr) {}
		  }
		装饰模式比继承灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系
		装饰类具备的功能与已有类功能相同,只不过更强
		  所以装饰类和被装饰类都属于同一个体系(同一个父类或者接口)
	自定义装饰类    D1908 MyBufferedReaderDemo.java


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值