------- android培训、java培训、期待与您交流! ----------
正则表达式
• 符合一定规则的表达式 作用:操作字符串 特点:用于一些特定的符号来表示一些代码操作,简化书写 好处:可以简化对字符串的复杂操作。 弊端:符号定义越多,正则越长,阅读性越差。 • 例子:对QQ号码进行校验,要求:5~15 0不能开头,只能是数字 用String类的方法实现,代码比较复杂 用matches(regex) String regex = “[1-9][0-9]{4,14}”;
▸ 具体操作功能:
▸ 匹配String:boolean 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(); 返回true或false 其实String类中的matches方法,用的就是Pattern和Matcher对象来完成的,只不过被String的方法封装后,用起来较为简单,但是功能却单一 • 3. 关联后,获取正则匹配引擎 • 4. 通过引擎对符合规则的子串进行操作,比如取出 m.find() -> 将规则作用到字符串上,并进行符合规则的子串查找 m.group() -> 获取匹配后的结果 用循环表示: while(m.find()) { System.out.println(m.group()); System.out.println(m.start()+"...."+m.end()); //找到索引位置,包含头不包含尾 } 注意matches和find方法都会改变查找索引位置
▸ 练习
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