第十二天:正则表达式



正则表达式: 负责的字符串匹配处理规则, 应用广泛.
  学习建议: 1 要能够读懂"正则表达式"
           2 能够写出简单的"正则表达式"
           3 不要过多的分配学习时间!
  可以应用于: java grep vi
  1 字符集: [1234] 表示 1,2,3,4 之一
            [^12] 表示除了 1,2
            [1-5] 表示 1,2,3,4,5
            [a-f] 表示 a-f 之间的
            [0-9a-fA-F] 表示:一个16进制字符
    预定义字符集:
            \d : [0-9]
            . : 任意字符
            \w: 单词字符 [0-9a-zA-Z_]
            \s: 匹配空白: 
            
  2 {m,n} 数词
       {n}
       {m,n}
       ? : {0,1}
       + : {1,}
       * : {0,}
  
  3 ^ 开头
    $ 结尾  
  
邮政编码: ^[0-9][0-9][0-9][0-9][0-9][0-9]$
         ^[0-9]{6}$
         ^\d{6}$
         
用户名规则: ^\w{8,10}$
电话号:  +86 13912345678
        ^(\+86)?\s?\d{11}$
身份证号码: ^\d{15}(\d{2}[0-9xX])?$
一个点的坐标: ^\d+(,\s*|\s+)\d+$ 
           3,2 
           3, 2
           3 2
           3  2
           
  日期: 2011-01-30
           
String 对正则表达式的支持
  .matches() 匹配正则表达式
  .split("[,\s\|]") 切分字符串为字符串数组
  .replaceAll()
  
String date = "2011年1月3日";
date = date.replace("日", "")
      .replaceAll("[年月]", "-");
      
      //替换时间,参数可以用正则表达式!
      
  
案例:
  编写方法,实现从控制台读取点坐标, 并且解析返回Point对象
  如果用户输入格式错误就重新输入.
  提示:
    使用 matches() 验证坐标规则
    使用 split() 切分坐标
    解析整数使用:Integer.parseInt(String str) -> int
//split()、replaceAll()这几个方法的参数都可用正则表达式!



  

StringBuffer 和 StringBuilder
 1 StringBuilder 是变长字符序列
//StringBuilder 的内部是一个使用变长算法维护的char[]

 2 StringBuilder 方法:append,insert ... 都返回
   当前 StringBuilder 对象本身的引用。
//.insert(0, "大师")//java中索引都是从0开始,表示把两个字插入在0位置,那么在0位置的李就要往后移动了。
//这非常好,0就表示在第0个位置插入,以前在0位置的只能后移。 
//还是那句话,java中所有的索引都是从0开始的。
 
 3 如果软件需要大量字符串处理时候建议使用StringBuilder
 
 4 String s = s1+s2; Java实际上才是如下代码运行:
   String s = new StringBuilder(s1)
   .append(s2).toString();
  
   String s = s1+s2+s3+s4; 被优化为
   String s = new StringBuilder(s1)
   .append(s2).append(s3).append(s4).toString();
   
   s+="a";//会产生两个新对象(StringBuilder, String)
   s+="a";//会产生两个新对象
   StringBuilder buf=new StringBuilder();
   buf.append("a");
   buf.append("a");
   
 5 StringBuffer 和 StringBuilder API几乎一样!
   StringBuffer 是java早期提供的,速度稍慢,线程安全
   StringBuilder 是Java5 以后提供的,速度快,非线程安全

根据例子得出结论:
如果是在一行的连加String s = s1+s2+s3+s4;问题不大。
如果是在多行的连加
s+="a";
s+="a";
s+="a";
s+="a";
效率相差十分大,
这个时间就是用:
   StringBuilder buf=new StringBuilder();
   buf.append("a");
   buf.append("a");
   buf.append("a");
   buf.append("a");

//java内存中只有二进制的数,只是在输出时间,是按照十进制输出的。
//因为java是面向对象的,但是有8个基本类型,所以java要把它们封装成8个
//对象类型。
每个charAt()就是代表一个字符,可能是英文,也可是中文,反正就是一个字符 。
包装类,可以把基本类型包装成对象类型。
java中的包装类
  1 包装类可以把基本类型包装为对象类型
  2 有八种包装类
     int  Integer
     long Long
     byte Byte
     short Short
     float Float
     double Double
     boolean Boolean
     char Character
  3 包装类提供了 对应数据类型的工具方法
    Integer.toHexString()
    Integer.toString(int)
    Integer.toBinaryString()
    Integer.parstInt(String)
    "3f"->int
    Integer.parstInt(String, int)//把string字符串,转换成int类型,第二个参数表示第一个参数是几进制。
    
    "2.718" -> 2.718 
    Double.parseDouble(String str);
    
自动包装(auto boxing / unboxing)(java5 以后可以):
//因为当年sun公司出了8种包装类,自动包装的出现只是为了易于它们与基本类型之间的转换。
  Integer i = 2;// i=new Integer(2); --java底层是这样做的。
  Object o = 3.5;//它其实是个double的包装类。
  System.out.println(o instanceof Double); //true
  int a = i+1;// a = i.intValue() + 1;--自动拆包
  
注意 
  1 包装类是final的类
  2 包装类对象是不变的, 与字符串类似(不变模式)
    Integer a = 1;
    Integer b = 2;
    Integer c = a+b;
  3 包装类覆盖了 toString equals hashCode

  
//案例: 控制台输入一串字符串
  // 转义输出为\uxxxx 的形式, 英文不处理
  // 如: "A中" -> "A\u4e2d"
  要求包装方法: 输入为原始字符串,返回转义字符串

预习: 时间

//java中最基本的时间是long,为了使用方便,给它包了一个壳。
//与string也一样,最本质的是char[],为了使用方便,有了很多包装类,仅仅是为了使用方便。

时间日期
  1 java 中基本的时间表示 long 
  2 Java提供了Date类型表示时间和日期
    Date 是long类型的包装
  3 Calendar 是历法的的抽象.
    历法: 公历, 农历, 太阳历, ...
    GregorianCalendar 是历法的实现, 采用公历
    (太阳历) 算法实现的. 
    Calender cal = Calender.getInstance();
  4 long <---------->Date <---------> Calendar
       long getTime()     Date getTime()
       setTime(long)      setTime(Date)
    
    long time = 0;//1970 1 1
    Date date = new Date(); //当前时间
    date.setTime(time);// 1970 1 1
    Calendar cal = 
      new GregorianCalendar();//当前时间
    cal.setTime(new Date(time));// 1970 1 1
    Date d = cal.getTime();
    long l = cal.getTime().getTime();//0
       
  5 Date 和 Calendar 的默认值就是当前时间
  6 日期的计算
    如: 计算商品的促销日期:
    输入: 商品生产日期, 和保质期月份
    返回: 商品的促销日期, 是过期前一周的周日
    
  7 日期的输入与输出
    java.text.SimpleDateFormat fmt = 
      new SimpleDateFormat("yyyy-MM-dd");
    
    构建SimpleDateFormat 一般提供日期的格式
     "yyyy-MM-dd" 具体参看 javadoc
    如: "yyyy-MM-dd HH:mm:ss"
       "yyyyMMdd"
       "dd/MM/yyyy"
       "MM/dd/yyyy"
    
    fmt.parse(String)可以实现将(合法)字符串解
     析为日期类型, 经常用于处理日期输入.
     
    fmt.format(Date) 可以把日期格式化为字符串
     用于输出处理.










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值