13.1不可变String
13.2 重载“+”与StringBuilder
1、String对象是不可变的,可以给一个String对象加任意多的别名。因为String对象具有只读特性,所以指向它的任何引用都不可能改变它的值,因此,也就不会对其他的引用有什么影响。
13.3无意识的递归
1、容器类都有toString()方法,并且覆写了该方法,使得它生成的String结果能够表达容器自身,以及容器所包含的对象。例如ArrayList.toString()方法,它会遍历ArrayList中包含的所有对象,调用每个元素上的toString()方法。
13.4String上的操作
1、当需要改变字符串的内容时,String类的方法都会返回一个新的String对象。同时,如果内容没有发生改变,String的方法只是返回指向原对象的引用而已。
13.5格式化输出
13.5.1printf()
13.5.2System.out.format()
13.5.3Formatter类
1、所有新的格式化功能都有java.util.Formatter类处理。可以将Formatter看作一个翻译器,它将格式化字符串与数据翻译成需要的结果。当创建一个Formatter对象的时候,需要向其构造器传递一些信息,告诉最终的结果将向哪里输出。
13.5.4格式化说明符
1、Formatter对象通过在必要时添加空格,来确保一个域至少达到某个长度。在默认的情况下,数据是右对齐,不过可以通过使用“-”标志来改变对齐方向。
13.5.5Formatter转换
1、程序中的每个变量都用到了b转换,虽然它对各种类型都是合法的。但其行为却不一定与想象一致。对于boolean基本类型或Boolean对象,其转换结果是对应的true或false。但是,对其他类型的参数,只要该参数不为null,那转换的结果就永远都是true。即使是数字0,转换结果依然为true,而这在其他语言中,往往转换为false
13.5.6String.format()
1、String.formate()是一个static方法,接收与Formatter.format()方法一样的参数,但返回一个String对象。
2、String.format()内部,创建一个Formatter对象,然后将传入的参数传给该Formatter。
13.6正则表达式
1、正则表达式提供了一种完全通用的方式,能够解决各种字符串处理相关的问题:匹配、选择、编辑以及验证。
13.6.1基础
1、正则表达式就是以某种方式来描述字符串。
2、split()方法
13.6.3量词
1、量词描述了一个模式吸收输入文本的方式:
①贪婪型:量词总是贪婪的,除非有其他的选项被设置。贪婪表达式会为所有可能的模式发现尽可能多的匹配。
②勉强型:用问好来指定,这个量词匹配满足模式所需的最少字符数,因此也称作懒惰的、最少匹配的、非贪婪的、或不贪婪的。
③占有型:当正则表达式被应用于字符串时,会产生相当多的状态,以便在匹配失败时可以回溯。而“占有的”量词并不保存这些中间状态,因此可以防止回溯。常常用于防止正则表达式失控,因此可以使正则表达式执行起来更有效。
13.6.4Pattern和Matcher
1、java.util.regex 可以用Pattern.compile()方法来编译正则表达式,它会根据传入的String类型的表达式生成一个Pattern对象。接下来,把想要检索的字符串传入Pattern对象的matcher()方法。matcher()方法会生成一个Matcher对象。Matcher对象的replaceAll()方法能将所有匹配的部分都替换成你传入的参数。
2、
`public class TestRegularException {
public static void main(String[] args) {
if(args.length<2){
System.out.println("Usage:\n java TestRegularException "+"characterSequence regularException");
System.exit(0);
}
System.out.println("Input:\""+args[0]+"\"");
for (String arg:args) {
System.out.println("Regular exception:\""+arg+"\"");
Pattern pattern = Pattern.compile(arg); //规则
Matcher matcher =pattern.matcher(args[0]); //参数
while (matcher.find()){ //遍历整个参数
System.out.println("Match\""+matcher.group()+"\" at positions "+matcher.start()+"-"+matcher.end());
}
}
}
}
3、find()可以在输入的任意位置定位正则表达式。lookingAt()和matches()只有在正则表达式与输入的最开始处就开始匹配才会成功。Matchers()只有在整个输入都匹配正则表达式时才会成功,而lookingAt()只要输入的第一部分匹配就会成功。
13.6.5 spilt()
1、spilt()方法将输入字符串断开成字符串数组
13.6.6 替换操作
1、replaceFirst(String replacement)以参数字符串replacement替换掉第一个匹配成功的部分。replaceAll(String replacement)以自参数字符串replacement替换所有匹配成功的地方。
13.6.7 reset()方法
1、通过reset()方法,可以将现有的Matcher对象应用于一个新的字符序列。使用不带参数的reset()方法,可以将Matcher对象重新设置到当前字符序列的起始位置。
2
`public class Resetting {
public static void main(String[] args) {
Matcher matcher = Pattern.compile("[frb][aiu][gx]").matcher("fix the rug with bags");
while (matcher.find()){
System.out.print(matcher.group()+" ");
}
System.out.println();
matcher.reset("fix the rig with rags");
while (matcher.find()){
System.out.println(matcher.group()+" ");
}
}
}`
13.6.8正则表达式与Java I/O
13.7扫描输入
1、Scanner的构造器可以接收任何类型的输入对象。包括File对象。InputStream对象,String或者像此例中的Readable对象。
13.7.1Scanner定界符
1、在默认情况下,Scanner根据空白字符对输入进行分词,但是可以用正则表达式指定自己所需的定界符。
2、
`public class ScannerDelimiter {
public static void main(String[] args) {
Scanner scanner = new Scanner("12,42,78,99,42");
scanner.useDelimiter("\\s*,\\s*"); //使用useDelimiter()来设置定界符
Pattern pattern =scanner.delimiter(); //delimiter()方法,用来返回当前正在作为定界符正在使用的pattern对象
System.out.println(pattern);
while (scanner.hasNextInt()){
System.out.println(scanner.nextInt());
}
}
}`
13.7.2用正则表达式扫描
public class ThreatAnalyzer {
static String threatData="58.27.82.161@02/10/2005\n" +
"204.45.234.40@02/11/2005\n" +
"58.27.82.161@02/11/2005\n" +
"58.27.82.161@02/12/2005\n" +
"58.27.82.161@02/12/2005\n" +
"[Next log section with different data format]";
public static void main(String[] args) {
Scanner scanner = new Scanner(threatData);
System.out.println(1);
String pattern="(\\d+[.]\\d+[.]\\d+[.]\\d+)@"+"(\\d{2}/\\{2}/\\d{4})";
System.out.println(1);
while(scanner.hasNext(pattern)){
// System.out.println(1);
scanner.next(pattern);
MatchResult matchResult=scanner.match();
// System.out.println(1);
String ip=matchResult.group(1);
String date =matchResult.group(2);
System.out.format("Threat on %s from %s\n",date,ip);
}
}
}
13.8 StringTokenizer
public class ReplacingStringTokenizer {
public static void main(String[] args) {
String input="But i am not dead yet! I feel happy";
StringTokenizer stringTokenizer = new StringTokenizer(input);
while (stringTokenizer.hasMoreElements())
System.out.print(stringTokenizer.nextToken()+" ");
System.out.println();
System.out.println(Arrays.toString(input.split(" ")));
Scanner scanner = new Scanner(input);
while (scanner.hasNext()){
System.out.print(scanner.next()+" ");
}
}
}