thinking in java学习记录(十三)字符串

13.1 不可变字符串

String对象是不可变的,String类中每一个看起来像是会修改String值的方法,实际上都是创建了一个新的String对象,最初的String对象是没有改变的。

参数是为方法提供信息的,而不是用来让方法改变自己的

13.2 重载“+”与StringBuilder

一个String对象初始化了,就不能再改变它的值了

Java中重载的“+”其实就是使用了StringBuilder的append()

StringBuilder不是线程安全的,StringBuffer是线程安全的
StringBuilder有许多方法,例如:insert() replace() subString() reverse() append() toString() delete()

13.3 无意识的递归

如果在toString方法中使用this,那么就会进入递归,最好的方法是super.toString()来代替this

13.4 String上的操作

13.5 格式化输出

13.5.1 printf()
与C的标准输出一样

13.5.2 System.out.format()
format()方法可用于PrintStream和PrintWriter,模仿于C的printf()

13.5.3 Formatter类
可以将Formatter看做一个翻译器,它将你的格式化字符串和数据翻译成需要的结果。当你创建一个Formatter时,要向其中传入参数,告诉他结果向哪里输出

13.5.4格式化说明符
%[argument_index$][flags][width][.precision]conversion

13.5.5 Formatter转换

d 整数型
c Unicode字符
b Boolean
s String
f 浮点数
e 浮点数(科学技术)
x 整数(16进制)
h 散列码(16进制)
% 字符‘%’

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

13.6 正则表达式

13.6.1 基础
""是转义符号

13.6.2 创建正则表达式

字符
B 指定字符B
\xhh 16进制为oxhh的字符
\uhhhh 16进制表示oxhhhh的Unicode字符
\t 制表符Tab
\n 换行符
\r 回车
\f 换页
\e 转义
字符类
. 任意字符
[abc] 包含abc的任何字符
[^abc] 除了abc的任何字符
[a-zA-Z] 从a-z和A-Z的任何字符
abc[hij] 任意abchij的字符(合并)
\s 空白符
\S 非空白符
\d 数字0-9
\D 非数字
\w 词字符(a-zA-Z0-9)
\W 非词字符
逻辑操作符
XY Y跟在X后面
X|Y X或Y
(X) 可以在表达式用\i引用第i个捕获组
边界匹配符
^ 一行的开始
$ 一行的结束
\b 词的边界
\B 非词的边界
\G 前一个匹配的结束

13.6.3 量词

X? 一个或零个X
X* 0个或多个X
X+ 1个或多个X
X{n} 恰好n次X
X{n,} 至少n次X
X{n,m} X的次数在n,m之间

13.6.4Pattern和Matcher
使用正则表达式需要导入java.util.regex包然后用static Pattern.conpile()方法来编译你的正则表达式即可,他会根据传入的String字符串中的正则表达式生成一个Pattern对象,接下来把需要检索的字符串传入Pattern对象的matcher()方法,matcher()方法会返回一个Matcher对象,Matcher对象有很多有用的方法

boolean matches():用来判断整个输入字符串是否匹配
boolean lookingAt():判断字符串输入的开始部分是否匹配
boolean find():查找多个匹配,一次返回一个匹配,想要下一个要再次调用
boolean find(int start):start表示开始的地方

组(Groups)组是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为零表示整个表达式,组号为1表示被第一队括号括起来的组
group()方法只返回匹配的部分

find()可以在输入的任意位置定位正则表达式,而lookingAt()和matches()只有在正则表达式与输入的最开始处就开始匹配开会成功

Pattern标记:
Pattern类的compile()方法还有重载方法
Pattern Pattern.compile(String regex,int flag);

?i 不考虑大小写
?m 多行模式(^和$匹配一行的开头和末尾)
?x 忽略空白符

13.6.5 split()
String[] split(CharSequence input)
String[] split(CharSequence input,int limit)
以正则表达式匹配的边界切分

13.6.6 替换操作
正则表达式特别便于替换文本
replaceFirst(String replacement)以参数replacement替换第一个匹配成功的部分。
replaceAll(String replacement)替换所有匹配的部分
appendReplacement(StringBuffer sbuf,String replacement)渐进式替换,每调用一次替换下一个,可以用appendTail(StringBuffer sbuf)将输入字符串剩下的部分复制到sbuf中

13.6.7 reset()
可以将现有的Matcher对象应用于一个新的字符序列,使用不带参数的reset可以将Matcher对象重新设置到当前字符串的开始位置

13.6.8 正则表达式与java I/O

13.7 扫描输入
Scanner的构造器可以接受任何类型的输入对象(File,InputStream,String,或者任何readable对象),Scanner所有的输入,分词,以及翻译的操作都隐藏在不同类型的next方法中,

13.7.1 Scanner定界符
scanner.useDelimiter(String ”x")修改Scanner的定界符

13.7.2 用正则表达式扫描
Scanner.hasNext(pattern)
Scanner.next(pattern)
对下一个输入分词进行正则匹配

13.8 StringTokenizer
13.9 总结

发布了28 篇原创文章 · 获赞 1 · 访问量 641

猜你喜欢

转载自blog.csdn.net/c630843901/article/details/102907204