admin管理员组

文章数量:1558055

有时候在想,我的头发是什么时候脱落的最多,现在想来,应该就是学字符串的时候

面试中经常问到的String、StringBuilder、StringBuffer

      当你调用String方法时,并不是在String原有的对象存储空间上个改变String,而是会创建新的空间。当你使用String创建变量,并直接用字符串赋值,编译器会自动调用StringBuilder来创建String,因为这样会更加高效。StringBuilder可以在原有的对象上进行修改。可以通过终端 输入

javap -c Class名称

进行反编译查看。
      StringBuffer是线程安全的,因此,它的开销就大一些。
当对一个类直接使用this与字符串连接时,会陷入递归,并报错

 public String toString(){
        //如果把super.toString()变换成this就会报错
            return "ClassAddress"+super.toString()+"\n";
    }
格式化输出

      java中也可以与C中printf方法一下,将输出进行格式化,一段是格式化语句,一段是参数列表。java中的format()与printf()是等价的。format()可以用于PrintStream和PrintWriter。

Formatter

      新的格式化功能都有Formatter处理。当创建一个Formatter对象时,需要在构造器参数中增加信息,告诉向哪里输出(通常包含PrintStream、OutputStream、File)。

格式化说明符

      

正则表达式

查看JavaAPI文档,我慢慢翻译,先发布

其中一些用法我将整理在下面:
x           x代表任意字符
\\           代表反斜杠
\0n        8进制字符(0<=n<=7)
\0nn      具有 8进制字符 0nn (0 <= n <= 7)
\0mnn   具有8进制的字符 0mnn (0 <= m <= 3, 0 <= n <= 7)
\xhh       具有16进制的字符 0xhh
\uhhhh   具有16进制的字符0xhhhh
\x{h…h} 具有16进制的字符 0xh…h (Character.MIN_CODE_POINT <= 0xh…h <= Character.MAX_CODE_POINT)
\t           制表符 (’\u0009’)
\n           换行符 (’\u000A’)
\r           回车符 (’\u000D’)
\f           换页字符 (’\u000C’)
\a           The alert (bell) character (’\u0007’)
\e           转义字符 (’\u001B’)
\cx         与x对应的控制字符

Character classes
[abc]           或a,或 b,或 c
[^abc]         除a,b或c以外的任何字符
[a-zA-Z]     a到z或A到Z,包括(范围)
[a-d[m-p]]        a到d,或m到p:[a-dm-p],取并集
[a-z&&[def]]     d, e, 或 f ,取交集
[a-z&&[^bc]]     a 到z除了b,c: [ad-z] ,取差集
[a-z&&[^m-p]]   a 到 z, 但不是m到p: [a-lq-z],取差集

预定义字符类别
.任何字符(可能匹配也可能不匹配行终止符)

\d        一个数字: [0-9]
\D        一个非数字: [^0-9]
\h         水平空白字符: [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]
\H        非水平空白字符: [^\h]
\s        一个空白字符 [ \t\n\x0B\f\r]
\S        非空白字符: [^\s]
\v        一个转行字符: [\n\x0B\f\r\x85\u2028\u2029]
\V        一个非转行字符: [^\v]
\w        文字字符: [a-zA-Z_0-9]
\W        一个非文字字符: [^\w]



POSIX字符类(仅限US-ASCII)
\p{Lower}    小写字母字符: [a-z]
\p{Upper}    大写字母字符:[A-Z]
\p{ASCII}    所有ASCII字符:[\x00-\x7F]
\p{Alpha}    一个字母字符:[\p{Lower}\p{Upper}]
\p{Digit}    一个十进制字符: [0-9]
\p{Alnum}    字母数字字符:[\p{Alpha}\p{Digit}]
\p{Punct}    标点符号:其中之一: !"#$%&’()*+,-./:;<=>?@[]^_`{|}~
\p{Graph}    可见字符: [\p{Alnum}\p{Punct}]
\p{Print}    可打印字符: [\p{Graph}\x20]
\p{Blank}    空格或制表符: [ \t]
\p{Cntrl}    控制字符: [\x00-\x1F\x7F]
\p{XDigit}    一个十六进制数字: [0-9a-fA-F]
\p{Space}    一个空白字符: [ \t\n\x0B\f\r]


java.lang.Character classes (一般的java字符类型)
\p{javaLowerCase} 等价于java.lang.Character.isLowerCase()
\p{javaUpperCase} 等价于java.lang.Character.isUpperCase()
\p{javaWhitespace} 等价于java.lang.Character.isWhitespace()
\p{javaMirrored} 等价于java.lang.Character.isMirrored()


Classes for Unicode scripts, blocks, categories and binary properties(Unicode脚本、块、类别和二进制属性的类)

\p{IsLatin}      拉丁文字 (script)
\p{InGreek}    希腊语句的字符 (block)
\p{Lu}            大写字母 (category)
\p{IsAlphabetic}    字母字符 (binary property)
\p{Sc}                    货币字符(currency character)
\P{InGreek}            非希腊语句的字符(negation)
[\p{L}&&[^\p{Lu}]]    非大写字母字符(subtraction)

Boundary matchers(边界匹配器)
^      一行的首字符
$      一行的结尾字符
\b      字界
\B      非字界
\A      输入的首字符
\G      The end of the previous match(上一次匹配的结尾)
\Z      输入的结尾,对于最后的终止符(如果有)
\z      输入的结尾



Linebreak matcher(换行符匹配项)
\R      任何Unicode编码换行序列, 等同于\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]



(量词会在后面讲到)
Greedy quantifiers(贪婪量词)
X?      X, 一次或者一次都没有
X*      X, 零次或多次
X+      X, 一次或多次
X{n}      X, 准确的n次
X{n,}      X, 最少n次
X{n,m}      X, 出现次数在【n,m】之间

Reluctant quantifier(勉强量词)
X??    X, 一次或一次都没有
X*?    X, 零次或多次
X+?    X, 一次或多次
X{n}?    X, 准确的n次
X{n,}?    X, 至少n次
X{n,m}?    X, 次数在【n,m】之间

Possessive quantifiers(所有格量词)
X?+         X, 一次或一次都没有
X*+         X, 零次或多次
X++         X, 一次或多次
X{n}+       X, 准确的n次
X{n,}+       X, 至少n次
X{n,m}+     X, 次数在【n,m】之间

Logical operators(逻辑操作符)
XY           Y跟着X
X|Y           X或者Y
(X)           X, as a capturing group(作为捕获组)

Back references(反向引用)
\n     不管第几个n捕获组匹配什么
\k     无论命名的捕获组“name”匹配什么

Quotation(引用)
\         只是引用紧接着的字符
\Q         引用所有字符,直到\E
\E         引用所有字符以 \Q开始

Special constructs (named-capturing and non-capturing)(特殊结构(命名为捕获和非捕获))
(?X)             X, 作为一个命名的捕获组
(?:X)             X, 作为一个非捕获组
(?idmsuxU-idmsuxU)             Nothing, but turns match flags i d m s u x U on - off(仅轮流匹配idmsuxU的开关)
(?idmsux-idmsux:X)             X, as a non-capturing group with the given flags i d m s u x on - off(作为具有给定标志的非捕获组,i d m s u x 开关)
(?=X)           X, via zero-width positive lookahead(通过零宽度正展望)
(?!X)             X, via zero-width negative lookahead(通过零宽度负展望)
(?<=X)             X, via zero-width positive lookbehind(通过零宽度正注视)
(?<!X)             X, via zero-width negative lookbehind(通过零宽度负注视)
(?>X)             X, as an independent, non-capturing group(作为一个独立的,不捕捉的群体)

String.split()

      使用split()方法能够根据正则表达式对字符串进行切片。

private static String s="If there were less sympathy in the world, there would be less trouble in the world.";
    public static void split(String regex){
        System.out.println(Arrays.toString(s.split(regex)));

    }

    public static void main(String[] args) {
        split("\\W");
        split(" ");
        split("n\\W+");
    }
String.replaceFirst()&String.replaceAll()
String提供replace方法,也可以与正则表达式匹配
public static void replace(String regex){
        System.out.println(Arrays.toString(new String[]{s.replaceFirst(regex, "LOVEJAVA")}));
    }

正则表达式多次使用的话,非String对象的性能更佳

量词

量词分为三种

  • 贪婪量词-Greedy Quantifier
  • 勉强量词-Reluctant Quantifier
  • 所有(占有)型量词-Possessive Quantifier

(1)贪婪量词
    贪婪表达式会为所有可能的模式发现尽量多的匹配。
(2)勉强量词
    满足模式所需的最少字符数
(3)占有量词
    Java中的表达式,其他语言不可用。在使用正则表达式时不会保存中间值,可以用来防止回溯,防止正则表达式失控,有时他们更有效。
举例如下:

表达式X一个或没有:
X?	(贪婪)
X??	(勉强)
X?+ (占有) 

在使用X时,最好用()包起来,以免产生歧义!

Pattern与Matcher-使用正则表达式对象

    使用Patternpile()生成Pattern对象,再使用Pattern.match()生成Matcher对象。Matcher对象可以进行其他操作。

  • The matches method attempts to match the entire input sequence against the pattern.

  • The lookingAt method attempts to match the input sequence, starting at the beginning, against the pattern.

  • The find method scans the input sequence looking for the next subsequence that matches the pattern.
    -《官方文档》

本文标签: 之旅字符串正则表达式Java