java中的string类与正则表达式

一、String类
 String使用非常频繁,用来描述一个字符串.String中实现了很多
 对字符串方便的操作方法.
 String内部使用char[]实现字符串的数据保存
 
 字符串的"字面量(直接量)"也是String类型的实例
  
 String对象是不变对象.对象创建后内容不可更改,这样的规则使
 得String看起来更像简单类型.
 
 String中的每个字符都是有索引值的,第一个字符的索引值为0,
 依次类推
 
 String API
  charAt()   :返回指定索引处的char值
  length()  :返回字符串长度
  trim()    :返回去掉字符串两边的空白(不是空格)
                                的字符串
  toLowerCase() :将字符串中的英文全小写
  toUpperCase() :将字符串中的英文全大写
  indexOf()  :返回给定字符在当前字符串中第一次出
              现的索引值
  lastIndexOf() :返回给定字符在当前字符串中最后一次
        出现的索引值
  endsWith()  :判断当前字符串是否以给定字符串结尾
  startsWith() :判断当前字符串是否以给定字符串开始
  substring()  :截取字符串
  toCharArray() :将字符串转换为字符数组
  
静态字符串
 java在编译期间(javac)凡是遇到"字面量"与常量间的运算,都会
 先运算出结果,在进行编译工作
 例如:
  源代码中:
   String name = "abc" + "def";
  编译期间:
   String name = "abcdef";
 
 
 运行期间当字符串池中有String"字面量"时,java会直接引用,若
 没有才会创建对象
  
  String a = "abc";
  此时,字面量"abc"在String池中不存在,那么java创建一个
  String对象保存"abc",并放入String池中.
  
  String b = "abc";
  当执行到这句话时,"abc"在String池中已经存在,那么java
  会让b直接引用之前创建的字符串对象"abc",而不重复创建
  对象.尽可能优化字符串对象的重用(因为字符串是不变对象
  所以重用不会带来问题)
  
  因为这个特性,所以a==b为true是存在的.
 
二、正则表达式:
 正则表达式的作用:约束字符串的格式
 
字符集:
 []   :方括号表示其中的内容任选其一,代表一个字符
        [1234] 1,2,3,4任选其一
 ()   :表示一组内容,圆括号中可以使用"|"符号
 
 |   :逻辑或关系
        
 ^   :非,除了
     [^12] 除了1或2的其他字符
     
 -   :范围,范围应从小到大  
     [0-9]表示此字符只能是数字
     [a-f]表示此字符只能是a,b,c,d,e,f之一
     [0-6a-fA-F] 0123456abcdefABCDEF
 
 {n,m}  :修饰前一个字符,表示其出现n-m次.n应小于m
 {n}   :修饰前一个字符,表示其出现n次
 {n,}  :修饰前一个字符,表示其出现n次以上   
     0[xX][0-9a-fA-F]{1,8}
     0x7fffffff  int最大值
 
 预定义字符集:
 \d   :表示一个数字.与[0-9]意思一致
 .   :表示任意字符
 \w   :表示单词字符.[0-9a-zA-Z_] 包含个下划线
 \s   :表示空白: \t \n \r \b \p
 
 \D   :表示非数字
 \W   :非单词字符
 \S   :非空白
 
 ?   :修饰前一个字符出现0-1次.  {0,1}
 +   :修饰前一个字符出现1次以上.{1,}
 *   :修饰前一个字符出现任意次. {0,}

 
 注意:"."在正则表达式中代表任意字符,若想表示"."的原意,我们
   需要使用"\."表示
   网页url格式:
 [w]{3}\.[0-9a-zA-Z]+\.com
 
 通过上面的正则表达式,是否能描述
 wwww.sohu.com
 
 可以的.原因在于,正则表示式搜索整个字符串,判断部分内容满足
 格式就可以.

 为了解决让正则表达式全字符匹配.我们需要告诉正则表达式需要
 从字符串的开始到结尾^ $
 ^[w]{3}\.[0-9a-zA-Z]+\.com$
 
 常用的正则表达式: 
  
  邮编 :   ^[0-9][0-9][0-9][0-9][0-9][0-9]$    
      邮编只有6位数字
      ^[0-9]{6}$
      ^\d{6}$
  
  用户名:   单词字符出现8-10次
      ^\w{8,10}$
      ^[0-9a-zA-Z_]{8,10}$
  
     手机号码:   +86 15811111111   
        0086 15811111111
       15811111111
        
        ^(\+86|0086)?\s?\d{11}$
    
     身份证号:     15位或18位
                    18位最后一位有可能是x(大小写均可)
                    ^\d{15}(\d{2}[0-9xX])?$ 
    
     一个坐标:     18  ,  789
           18 789
          ^\d+(\s*,\s*|\s+)\d+$
     
     正确答案:     ABCD  A,B  A B C  A , B
 ^A?(\s*|\s*,\s*)?B?(\s*|\s*,\s*)?C?(\s*|\s*,\s*)?D?$
 
 
     日期格式:     2012-08-17
        ^\d{4}-\d{2}-\d{2}$
        ^\d{4}(-\d{2}){2}$
      
        2012-99-99
        
        
   email   :     ^\w+@\w+(\.(com|cn|net))+$ 
 
=======================================================
String中对正则表达式的支持
 String的API中有几个方法支持正则表达式
 matches()  匹配正则表达式
 slipt()         根据正则表达式拆分字符串
 replaceAll() 将满足正则表达式的部分已给定字符串替换


缓冲字符串StringBuffer和StringBuilder
 String:char[] + 操作  char[]为不变对象
     优点:使用起来更自然,贴近基本类型
     缺点:字符串拼接时资源消耗大!处理速度慢(要创建很多对象)
  
 在进行大规模频繁修改字符串时,String的缺点明显!
 这时应使用缓冲字符串
 
 StringBuffer:char[] + 操作 char[]可变
 
 缓冲字符串中的char[]数组使用一种变长算法自动扩容当前
 char[]长度.以满足其中字符串数据的拼接与修改.
 
 StringBuffer的API:
  insert() :向当前字符串中指定索引处插入字符串
  append() :在当前字符串末尾追加字符串
  delete() :删除字符串中的部分内容
  toString()  :将当前缓冲字符串转换为String


 StringBuilder:和StringBuffer几乎一样,区别在于
      StringBuilder:线程非安全
      StringBuffer :线程安全

 String的拼接优化:
  String s = s1 + s2;
  java实际运行时优化为
  String s = new StringBuilder(s1).append(s2).toString();

猜你喜欢

转载自blog.csdn.net/wangjian530/article/details/82793775
今日推荐