有时候在想,我的头发是什么时候脱落的最多,现在想来,应该就是学字符串的时候
面试中经常问到的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-使用正则表达式对象
使用Pattern.compile()生成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.
-《官方文档》