第13章--字符串

Posted mjbenkyo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第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()--全部替换,参数是正则表达式










以上是关于第13章--字符串的主要内容,如果未能解决你的问题,请参考以下文章

java编程思想-第13章-某些练习题

C/C++目录

[读书笔记]Java编程思想

20180727--第2章03数据类型

第 13 章 文件输入/输出 (标准I/O)

Tcl/Tk入门经典的图书目录