zoukankan      html  css  js  c++  java
  • 字符串

    不可变String

      String对象是不可变的,String类中每一个看来会修改String值的方法,实际上都是创建了一个全新的对象,以包含修改后的字符串内容。它具有只读性。但是该特性会带来效率问题。为String对象重载的+操作符,则会产生n个String类型的中间对象。java在编译的过程中自动引入了StringBuider类。

    StringBuilder提供了insert(),replace(),substring(),revserse(),delete()和toString()方法,它是线程不安全的方法。

    容器类都有toString()方法,并且覆盖了该方法,使得它生成的String结果能够表达容器自身,以及容器所包含的对象。

    String常用方法:

    length()  String中字符的个数

    charAt(int index)  取得String中index位置上的char

    getChars(int startIndex, int endIndex),getBytes(int startIndex, int endIndex)  复制char或byte到一个目标数组(startIndex和endIndex不传入则默认为0,str.length() -1)

    toCharArray()  生成一个char[],包含String所有的字符串

    equals(String str),equalsIgnoreCase(String str)  比较两个String内容是否相同

    compareTo(String str)  按字典顺序比较String的内容,比较结果为负数,零或整数。大小写并不等价

    contains(char charSequence)  如果str包含charSequence,返回true

    contentEquals(char charSequence/StringBuffer sb)   如果String与参数内容完全一样,返回true

    regionMatcher(int index, int compareIndex, int length)  返回boolean类型,以表明所比较区域是否相等

    startsWith(String str)  返回boolean类型,以表明该String是否以str开头

    endWith(String str)  返回boolean类型,以表明该String是否以str结尾

    indexOf(char ch),lastIndexOf(char ch)  如果String并不包含ch,则返回-1,否则返回参数在String中的起始索引。

    subString(int startIndex, int endIndex),subSequence(int startIndex, int lastIndex)  返回一个新的String,以包含参数指定的字符串

    concat(String str)  返回一个新的String对象,内容为原始String连接上参数String

    replace(char ch)  返回替换字符后新的String对象,如果没有替换发生,则返回原始String对象

    toLowerCase(),toUpperCase()  将字符的大小写改编后,返回一给新的String对象

    trim()  将String两端的空白字符删除后,返回一个新的String对象

    valueOf(...)  返回一个表示参数内容的String

    intern()  为每一个唯一的字符序列生成一个且仅生成一个String引用

    C中printf()它使用一个简单的格式化字符串,加上要插入其中的值,然后将其格式化输出。printf()并不使用重载的+操作符来连接引号内的字符串或字符串变量,而是使用特殊的占位符来表示数据将来的位置,他还将插入格式化字符串的参数,以逗号分隔,排成一排。这些占位符被称作格式修饰符,他们不但说明了插入数据的位置,同时还说明了将插入什么类型的变量以及如何对其格式化。

    Java SE5引入的format方法可用于PrintStream或PrintWriter对象。format模仿C中的printf()。所有的格式化功能都由java.util.Formatter类来处理。当你创建一个Formatter对象时候,需要像其构造器传递一些信息,告诉它最终的结果将向哪里输出。Formatter使用下面的抽象语法来控制更加精细的格式

      %[argument_index$][flags][width][.precision]conversion

    width指定一个域的最小尺寸,formatter在必要时加入空格来确保这个域达到最小尺寸。

    默认情况下数据是右对齐的,可以使用-改变对齐方向

    precison指定最大尺寸。precison并不可作用于所有类型。当作用于String时,表示能输出字符的最大数量,作用于浮点数时,表示小数点后要显示出来的位数。作用于int时,则会抛异常

    Formatter转换参数

    d  整数型        e  浮点数(科学计数)

    c  Unicode字符       x  整数(十六进制)

    b  boolean值      h  散列吗(十六进制)

    s  String          %  字符%

    f  浮点数(十进制)

    String.format()是一个static方法,它接受与Formatter.format()方法一样的参数,但返回一个String对象。

    正则表达式

      在java中,\表示我要插入一个正则表达式的反斜线,所以其后面的字符具有特殊的意义。如正常情况下d在正则表达式中表示一个数字,而在java中应该用\d表示一个数字。换行符( )和制表符( )之类除外。在一个或多个之前用+表示;?表示前面的那个字符可能存在,也可能不存在;|表示或操作;W表示非单词字符;w表示一个单词字符;i表示不区分大小写

      如:-?\d+  可能有一个负号后面跟着一个或多个数字

    String自带matches(regex)方法来匹配字符串是否符合正则表达式;String还提供split()方法嫁给你字符串从正则表达式匹配的地方切开;Spring提供了replace(regex, "str")方法来对匹配的字符串进行替换

    字符

    B  制定字符B

    xhh  十六进制值为oxhh的字符

    uhhhh  十六进制表示为oxhhhh的Unicode字符

      制表符Tab

      换行符

      回车

    f  换页

    e  转义

    字符类

    .  任意字符

    [abc]  包含a,b和c的任何字符,与a|b|c等价

    [^abc]  除了a,b和c之外的任何字符

    [a-zA-Z]  从a到z或从A-Z的任何字符

    [abc[hij]]  任意a,b,c,h,i和j字符,与a|b|c|h|i|j等价

    [a-z&&[hij]]  任意h,i和j字符

    s  空白符(空格,tab,换行,换页和回车)

    S  非空白符,与[^s]等价

    d  数字[0-9]

    D  非数字[^0-9]

    w  词字符[a-zA-Z0-9]

    W  非词字符[^w]

    逻辑操作符

    XY  X紧跟在Y后面

    X|Y  X或Y

    (X)  捕获组

    边界匹配符

    ^  一行的起始

    $  一行的结束

      词的边界

    B  非词的边界

    G  前一个匹配的结束

    量词描述了一个模式吸收输入文本的方式

    贪婪型:贪婪表达式会为所有可能的模式发现尽可能多的匹配

    勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符数

    占有型:当正则表达式被应用于字符串时,它会产生相当多的状态,以便在匹配失败时可以回溯。而占有型量词并不保存这些中间状态,因此可以防止回溯。常常用于防止正则表达式失控

    贪婪型      勉强型      占有型      如何匹配

    X?        X??       X?+       一个或多个X

    X*         X*?         X*+         零个或多个X

    X+        X+?         X++         一个或多个X

    X{n}       X{n}?       X{n}+      恰好n次X

    X{n,}      X{n,}?       X{n,}+      至少n次X

    X{n,m}       X{n,m}?        X{n,m}+       X至少n次,且不超过m次

             

    可以使用java.util.regex包中的statci Pattern.compile()方法来编译正则表达式,它会根据正则表达式生成一个Pattern对象。Pattern的matcher(reg)方法会生成一个Matcher对象。Matcher()方法提供了boolean matches();boolean lookingAt();boolean find()和boolean find(int start) 方法判断不同类型的匹配是否成功。Pattern对象还提供了static boolean matchers(String rege, CharSequence input)方法来检查regex是否匹配整个CharSequence。

    Matcher.find()方法用来在CharSequence中查找多个匹配。find(i)能接收一个整数作为参数,该参数表示字符串中字符的位置,并以其作为搜索起点。

    组是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为0表示整个表达式,组号为1表示第一个被括号括起来的表达式。Matcher提供了一些列方法用以获取与组相关的信息:public int groupCount()返回该匹配器的模式中的分组数目,第0组不包括在内;public String group()返回前一次匹配操作的第0组;public String group(int i)返回在前一次匹配操作期间指定的组号,若不存在,则返回null;public int start(int group)返回在前一次匹配操作中寻找到的组的起始索引。public int end(int group)返回在前一次匹配操作中寻找到的组的最后一个字符索引加一的值。

     start()返回匹配起始位置的索引,end()返回所匹配的最后字符的索引加一的值。匹配失败调用start()或end()会产生IllegalStateException。

    find()可在输入的任意位置定位正则表达式;lookingAt()和matches()只有在正则表达式与输入的最开始出就开始匹配时才会成功。matches()只有在整个输入匹配正则表达式时才会成功,而lookingAt()只要输入的第一部分匹配就会成功。

    Pattern类的compile()接收一个标记参数以匹配的行为:

      Pattern.CANON_EQ  两个字符当且仅当他们的完全规范分解相匹配时,就认为他们是匹配的。默认的情况下,匹配不考虑规范的等价性  

      Pattern.CASE_INSENSITIVE(?i)  默认情况下,大小写不敏感的匹配假定只有US-ASCII字符集中才能进行。基于UNICODE_CASE标记结合此标记可以开启基于Unicode的大小写不敏感的匹配

      Pattern.COMMENTS(?s)  空格符将被忽略,同时以#开始直到行末的注释也会被忽略掉

      Pattern.DOTALL(?s)  在dotall模式中。表达式.可以匹配所有字符,包括终结符

      Pattern.MULTILINE(?m)  在多行模式下,表达式^和$分别匹配一行的开始和结束。^还匹配输入字符串的开始,而$还匹配输入字符串的结尾。

      Pattern.UNICODE_CASE(?u)  与Pattern.CASE_INSENSITIVE(?i)连用

      Pattern.UNIS_LINES(?d)  .,^和$行为中,只识别

    split()方法将输入字符串断开成字符串对象数组,断开便捷由下列正则表达式决定:String[] split(CharSequence input);String[] split(CharSequence input, int limit);

    正则表达式提供了很多方法可以进行方法替换

      replaceFirst(String replacement):用replacement替换掉第一个匹配成功的部分

      replaceAll(String replacement):用replacement替换掉素有匹配成功的部分

      appendReplacement(StringBuffer sb, String replacement):允许调用其他方法生成或处理replacement,以编程的方式将目标分割成组

      appendTail(StringBuffer sb):在执行了一次或多次appendReplacemenet()方法之后,调用此方法可以将输入的字符串余下的部分复制到sb中

    reset()方法可以将现有的Matcher对象应用于一个新的字符序列。在循环外创建一个空的Matcher对象然后用reset()方法每次为Matcher加载一行输入性能会提高。

    StringReader将String转换为可读的流对象,用这个对象来构建BufferReader对象。BufferReader调用readLine()方法将一行输入转换成String,换句话说,readLine()方法是根据 来进行行的划分,若一行有两组及以上数据,需要自己进行分割。

    Java SE5新增了Scanner类。Scanner类可以接受任何类型的输入对象,包括File,InputStream,String或Readable对象。Scanner将所有的输入、分词一哦翻译的操作都隐藏在不同类型的next方法中。所有的next方法只有找到一个完整的分词后才会返回。Scanner的hasNext方法来判断下一个输入的分词是否是所需类型。在默认情况下,Scanner根据空白字符对输入进行分词,可以使用useDelimiter()方法根据正则表达式指定自己所需的定界符。delimeter()方法用来返回当前正在作为定界符使用的Pattern对象。使用next(pattern)方法将找到下一个匹配该模式的输入部分,调用match()方法可以获得匹配的结果。它仅仅针对下一个宿儒分词进行匹配。

    在J2SE1.4和JAVA SE5之前,分隔字符串的唯一方法是使用StringTokenizer。现已废弃

  • 相关阅读:
    梦断代码阅读笔记02
    第三周
    第二周
    《大道至简》阅读笔记
    暑假第一周
    hdu-1237简单计算器(栈的运用)
    玩骰子(概率,暴力)
    hdu-5568SUM (dp)
    codeforce-600C. Make Palindrome(贪心)
    codeforce-601A. The Two Routes(最短路)
  • 原文地址:https://www.cnblogs.com/forerver-elf/p/6417779.html
Copyright © 2011-2022 走看看