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

来源:互联网 发布:学高等数学的软件 编辑:程序博客网 时间:2024/06/05 13:32

------- 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.java1. 为了避免其他程序建立过多个该类对象,先禁止其他程序建立该类对象  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.javacurrentTimeMillis()定义功能时,只有一部分功能是确定的,而确定的部分在使用不确定的部分  此时将不确定的部分暴露出去,由子类来完成被复写的方法不一定是抽象的,可以有默认的功能

装饰设计模式

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


0 0
原创粉丝点击