zoukankan      html  css  js  c++  java
  • 第13章--字符串

    一,不可变/只读性

    String对象是不可变的,每次对String对象的修改都会创建一个新的String对象并返回其引用。

    这种设计也有其合理性:

      对于一个方法而言,参数是为该方法提供信息的,而不是让方法来改变自己的。(倘若就是希望改变该参数,那就用旧的引用来接受新的对象)。

    二,与StringBuilder的关系

      用于String对象的“+”和“+=”操作符是java中仅有的两个重载过的操作符,可用来连接String。

      (String“+”操作的自动类型转换:String对象后面跟“+”和另一个非String对象B时,编译器会调用B的toStirng()来将B转换成String类型)

      猜想:由于不可变性却带来了效率问题,会因此产生一大堆需要垃圾回收的中间对象。

      真实的工作情况是:String对象的“+”和“+=”操作时,编译器会自动引用StringBuilder来处理。

      编译器在此为我们自动优化了,但是它优化得有限,当在循环内进行字符串的加操作时,会重复创建多次StringBuilder对象,这显然是浪费的;因此对于类似循环的情况应该明确使用StringBuilder对象。

      StringBuilder是可变的,它提供了丰富的高效的对字符串的操作,insert();replace();substring();reverse();append();delete();toString();只需生成和操作一个StringBuilder对象便可以完成诸多字符串操作。

    三,正则表达式(这是我想讲的重点)

    能解决字符串处理的匹配问题。

    正则表达式

    分类:String对象的正则表达式

       非String对象的正则表达式

    注意:圆括号()作用是将正则表达式分组;|竖直线表示或操作; 换行符;java中\代表插入一个正则表达式的反斜线

    简单的途径:String类自带的正则表达式工具:

    (1).--切割--split(String regex)--:将字符串从正则表达式匹配的地方切开

    (2)--替换--{replaceFirst(String regex) , replaceAll(String regex)}

        replaceFirst(String regex)--替换正则表达式匹配的第一个子串;

        replaceAll(String regex)----替换正则表达式匹配的所有子串;

    (3)--匹配--matches(String regex)

    3.2--非String对象的正则表达式

    部分-正则表达式构造子列表:

    字符类:

    逻辑操作符:

    边界匹配符:

    量词:贪婪型;勉强型;

    CharSequence接口从CharBuffer,String,StringBuffer,StringBuilder类中抽象出来的一般化定义。

       interface CharSequence{

        charAt(int i);

        length();

        subSequence(int start,int end);

        toString();

      }

    构造正则表达式对象--重点来了

    Pattern和Matcher

    Pattern pattern=Pattern.compile(x);  编译正则表达式x,Pattern对象表示编译后的正则表达式。

    Matcher matcher=pattern.matcher(); Matcher对象有很多功能可用。在此介绍它的find(); group(); start(); end(); reset();

    例子:

    String reg="\d+mj"; //数字mj

    Pattern pattern=Pattern.compile(reg);

    Matcher matcher=pattern.matcher();

    while(matcher.find){

      System.out.println(matcher.group()+"---"+matcher.start()+"---"+matcher.end());

    }

    find()方法用来在CharSequence中查找多个匹配,注意关键词,"多个",所以才会用while来遍历。

    find()像迭代器那样向前遍历输入字符串。有个重载方法find(int startFindIndex),参数即字符串中搜索的起点。

    group()组--注意-要现有find()操作-再才有group组操作

    组是用括号划分的正则表达式,可根据组的编号来引用某个组;

    例子:a(b)(c)d   :group()/group(0)--abcd;   group(1)--b;    group(2)--c

    group()与group(0)作用相同--返回前一次匹配操作的第0组。

    groupCount()--返回组数,注意-不包括第0组

    start([int group])--返回前一次操作找到的组的起始索引

    end(int group)---返回前一次操作找到的组的最后一个字符索引加1的值

    reset();-----------将matcher应用与一个新的字符串

    易混点:

    1.匹配

    String自带的matches()--整个输入的字符串都匹配正则表达式才true

    Matcher的matches()--同上

    Pattern.matches(String reg,String charSequence)---同上

      if(Pattern.matches("\d+mj","mj123mj")){
        System.out.println("ok");
      }else{
        System.out.println("no");
      }

    Matcher的find()可以在输入的任意位置定位正则表达式,注意--是任意位置。这就很方便了

      Pattern pa=Pattern.compile("\d+mj");
      Matcher ma=pa.matcher("123mj123mj");
      while(ma.find()){
        System.out.println(ma.group());
      };

    2.替换

    String的replace()---全部替换,参数是普通的String

      与replaceAll()--全部替换,参数是正则表达式

  • 相关阅读:
    查询SQL数据库中表占用资源情况的语句
    修改VMware网卡MAC的方法
    Ajax 与 .net Validator
    控件属性值绑定到数据
    一个设计的小例子警察抓小偷
    加密Web.config 文件中的敏感信息
    VS .Net 2005程序集换名之后的遗留问题
    为ASP.Net 创建和配置应用程序服务数据库
    ArcGIS 9.0 在Windows XP SP2 上安装的问题(数据保护造成的)
    使用客户端脚本
  • 原文地址:https://www.cnblogs.com/mjbenkyo/p/9218188.html
Copyright © 2011-2022 走看看