字符串:
String类是不可变类,创建String对象后,该对象中的字符序列不能被改变。
StringBuffer是可变的字符串,创建StringBuffer对象后可以StringBuffer提供的各种方法改变该对象的字符序列。
StringBuilder与StirngBuffer基本相似(JDK1.5),不同点是 StringBuilder是线程不安全的,StringBuffer线程安全。
StringBuilder和StringBuffer是可变类,提供了一系列插入、追加、改变字符串里包含的字符序列的方法。示例如下:
public class Str {
public static void main(String[] args) {
StringBuilder sb=new StringBuilder();
sb.append("HelloIam");
sb.insert(5, 'J');
System.out.println(sb);// HelloJIam
sb.insert(2, "BT");
System.out.println(sb);// HeBTlloJIam
sb.replace(0,5, "Str");//将0~5(不包含5)之间的字符替换成"Str"
System.out.println(sb);//StrloJIam
sb.delete(0, 5);
System.out.println(sb);//JIam
}
}
String 类常用方法:
char charAt(int index) :获取index位置上的字符。
int compareTo(String anotherString) :比较两个字符串大小。相等返回0,不相等时,若较长字符串 前缀 是较短字符串,则返回他们的长度差; 不为前缀时返回第一个不相等的字符差。
static String copyValueOf(char [] data) : 将字符数组连缀成字符串,与String(char [] content)构造器的功能相同。
static String copyValueOf(char [] data,int offset,int count): 将char数组的子数组中的元素连缀成字符串,offfset为开始下标,count为长度。
boolean startsWith(String prefix):该String对象是否以prefix开始。
boolean endsWith(String suffix): 是否以suffix结尾。
byte[] getBytes(): 将String对象转换成byte数组。
String replace(char oldChar,char newChar) :将字符串中第一个 oldChar替换成newChar。
String substring(int beginIndex) :获取从beginIndex开始到结束的子字符串。
String substring(int beginIndex,int endIndex):获取从beginIndex到endIndex(不包含)位置的子字符串。
char [] toCharArray(): 将该String对象转换成char数组。
字符串与基本类型的转换(利用包装类)
字符串转基本类型:
1.利用包装类提供的parseXxx(String s)静态方法(除Character类之外所有包装类都提供了该方法)
2.利用包装类的构造器Xxx(String s)构造器。
基本类型转字符串:
1.利用String类的valueOf()方法。
2.直接用连接符号“+”。
String str="123";
int it1=Integer.parseInt(str);
int it2=new Integer(str);
String s=String.valueOf(it1); // float、double类型与之类似。
正则表达式:
1.String类提供的特殊方法。
boolean matchs(String regex) :判断该字符串是否匹配指定的正则表达式。
String replaceAll(String regex,String replacement):将所有匹配regex的子串替换成replacement.
String replaceFirst(String regex,String repalcement):将第一个匹配regex的字串替换成replacement.
String [] split(String regex): 将字符串以regex分隔开将分割的子字符串存入数组。
2. 创建正则表达式:
正则表达式支持的字符
x 任意字符x
\0mnn 八进制数mnn所表示的字符
\xhh 十六进制0xhh表示的字符
\uhhhh 十六进制0xhhhh表示的Unicode字符
\t 制表符('\u0009')
\n 换行符('\u000A')
\r 回车符('\u000D')
\f 换页符('\u000C')
\a 报警符('\u0007')
\e Escape符('\u001B')
\cx x对应的控制符。例:\cM匹配 Ctrl-M。x的值必须为字母符号。
正则表达式支持的特殊字符
$ 匹配一行的结尾。
^ 匹配一行的开头。
() 标记子表达式的开始和结束位置。
[] 用于确定中括号表达式的开始和结束位置。
{} 用于标记子表达式出现的次数。
* 指定表达式可以出现0次或多次。
+ 指定表达式可以出现一次或多次。
? 指定表达式可以出现0次或一次。
. 匹配除换行符\n之外的任何单字符。
\ 用于转义下一个字符或指定八进制,十六进制字符。
| 指定两项中选取一项。
上面的正则表达式依然只能匹配单个字符,若要匹配多个字符则需要使用“通配符”,匹配多个字符,系统预定义字符如下:
预定义字符
. 匹配任意字符
\d 匹配0~9的所有数字
\D 匹配非数字
\s 匹配匹配所有空白字符,包括 空格、制表符、回车符、换页符、换行符等。
\S 匹配非空白字符。
\w 匹配所有单词字符,包括 0~9所有数字,26个英文字母和下划线。
\W 匹配非单词字符。
特殊情况下,若只想匹配a~f的字母,或者匹配除ab以外的所有小写字母,上面预定义的字符就无能为力了,这时需要方括号表达式。
方括号表达式
表示枚举 例如[abc],表示a、b、c其中任意一个字符;[gz]表示g、z任意一个字符。
表示范围 - 例如[a-f] 表示a-f范围内任意字符;
[\\u0041-\\u0056],表示十六进制\u0041-\u0056范围的字符。
范围可以和枚举结合使用,如[a-cx-z],表示a~c,x~z范围内的任意字符。
表示求否 ^ 例如[^abc],表示非a,b,c的任意字符。[^a-f]表示不是a-f范围内的字符。
表示“与”运算:&& 例如[a-z&&[def]] a~z和def的交集,表示d、e或f。
[a-z&&[^bc]] a~z之间除了bc以外的任意字符。
[a-z&&[^m-p]] a~z之间范围内除了 m~f之间的任意字符。
表示“并”运算 并运算与枚举类似。例如[a-d[m-p]] 表示 [a-dm-p]
数量标识符的集中模式:
Greedy(贪婪模式): 默认采用贪婪模式。贪婪模式只要符合条件一直匹配下去,直到无法匹配。
Reluctant(勉强模式) : 用问号后缀(?)表示,只会匹配最少字符。
Possessive(占有模式): 用加号后缀(+)表示。
贪婪模式 勉强模式 占用模式 说明
X ? X?? X?+ X表达式出现0次或1次。
X* X*? X*+ X表达式出现0次或多次。
X+ X+? X++ X表达式出现1次或多次。
X{n} X{n}? X{n}+ X表达式出现n次 。
X{n,} X{n,}? X{n,}+ X表达式至少出现n次。
X{n,m} X{n,m}? X{n,m}+ X表达式最少出现n次,最多出现n次。
String str="hello,java!";
str.replaceFirst("\\w*","1"); //贪婪模式,结果为1,java!。
str.replaceFirst("\\w*?","1"); //勉强模式,结果为1hello,java!。
使用正则表达式:
Pattern p=Pattern.compile("a*b");//将正则表达式字符串编译成Pattern对象。
Matcher m=p.matcher("aaaaab"); // 使用Pattern对象创建Matcher对象。
boolean b=m.matches(); //是否匹配
也可以直接使用Pattern类的静态方法matches()进行匹配。(每次调用都需要编译正则表达式字符串,效率不高)
boolean b=Pattern.matches("a*b","aaaaaab"); //返回true。
Matcher类提供了几个常用的方法:
find(): 返回目标字符串是否包含与Pattern匹配的子串。
group(): 返回上一次与Pattern匹配的子串。
start(): 返回上一次与Pattern匹配的字串在目标字符串中的开始位置。
end(): 返回上一次与Pattern匹配的字串在目标字符串中的结尾位置+1。
lookingAt(): 返回目标字符串前面部分与Pattern是否匹配。
matches(): 返回整个目标是否与Pattern匹配。
reset(): 将现有的Matcher对象应用于一个新的字符序列。
测试:
public class Str {
public static void main(String[] args) {
Pattern p=Pattern.compile("((13\\d)|(15\\d))\\d{8}");
String str="我想买一本书,联系我13500003333"
+" my phone : 15834561234"+
"电话:15300003333";
Matcher m=p.matcher(str);
if(m.find()){
System.out.println(m.group());//13500003333
//我想买一本书,联系我嘿嘿 my phone : 嘿嘿电话:嘿嘿
System.out.println(m.replaceAll("嘿嘿"));
}
}
}