·实际开发中,经常需要对字符串数据进行一些复杂的匹配、查找、替换等操作。通过“正则表达式”,可以方便的实现字符串的复杂操作。
·正则表达式是以串特定字符,组成一个“规则字符串”,这个“规则字符串”是描述文本规则的工具。正则表达式就是记录文本规则的代码
·例如:
-正则表达式:“[a-z]”表示a到z的任意一个字符
-正则表达式:“[a-z]+”表示由一个或多个a-z字符组成的字符串
·字符集合
正则表达式 | 说明 |
[abc] | a、b、c中任意一个字符 |
[^abc] | 除了a、b、c中任意一个字符 |
[a-z] | a、b、c......z中任意一个字符 |
[a-zA-Z0-9] | a~z、A~Z、0-9中任意一个字符 |
[a-z&&[^bc]] | a-z中除了b和c以外的任意一个字符,其中&&表示“与”的关系 |
·预定义字符集
正则表达式 | 说明 |
. | 任意一个字符 |
\d | 任意一个数字字符,相当于[0-9] |
\w | 单词字符,相当于[a-zA-Z0-9_] |
\s | 空白字符,相当于[\t\n\x0B\f\r] |
\D | 非数字字符 |
\W | 非单词字符 |
\S | 非空白字符 |
·数量词
正则表达式 | 说明 |
X? | 表示0个或1个X |
X* | 表示0个或者多个X |
X+ | 表示1个或者多个X |
X{n} | 表示n个X |
X{n,} | 表示n到任意多个X(大于等于n个X) |
X{n,m} | 表示n到m个X |
·分组"()"
分组:()圆括号表示分组,可以将一系列正则表达式看做一个整体,分组时可以使用“|”表示“或”关系,例如匹配手机号码前面的分区:
//匹配手机号码前面的分区
/**
* - +86可有可无
* - +86与后面的号码之间空格可以没有或者有多个
* - +电话号码为11位
*/
String regExp = "(\\+86|)?\\s?\\d{11}";
·"^"和"$"
·边界匹配
- ^代表字符串开始
- $代表字符串结束
·例如:匹配用户名规则-从头到尾连续8~10个单词字符
/**
* 匹配用户名规则--从头到尾连续8~10个单词字符
* -- \w{8,10}
* -- ^\w{8,10}$
*/
String regExp1 = "\\w{8,10}";
String regExp2 = "^\\w{8,10}$";
String string = "abcd1234_er";
System.out.println(string.matches(regExp1));
System.out.println(string.matches(regExp2));
·split方法
·String的split方法可以将字符串按照特定的分隔符分成字符串数组
String[] split(String regex) | 参数regex为正则表达式 以regex所表示的字符串为分隔符,将字符串拆分成字符串数组。 |
/**
* 测试split方法:将字符串按照regex表示的字符串为分隔符,将字符串拆分成字符串数组
*/
@Test
public void testSplit() {
String regex = "\\d";
String string = "z 1 . +zhang 2 a1 31 4a";
String[] string2 = string.split(regex);
//Arrays中的toString方法返回所有元素,元素包含在[]内,各元素之间用","隔开
System.out.println(Arrays.toString(string2));//[z , . +zhang , a, , , , a]
}
·replaceAll方法
String replaceAll(String regex,String replacement) |
将字符串中匹配正则表达式的regex的字符串替换成replacement |
/**
* 测试正则表达式中的replaceAll方法
*/
@Test
public void testReplaceAll() {
//将str中放入所有数字替换成“数字”二字
String string ="abc123bca34edg5678fgsg6780";
String string2 = string.replaceAll("\\d", "数字");
System.out.println(string2);//abc数字数字数字bca数字数字edg数字数字数字数字fgsg数字数字数字数字
}
2.1 Object
Object ·在Java类继承结构中,java.lang.Object类位于顶端;
如果定义一个java类时没有使用extends关键字声明父类,则其父类默认为java.lang.Object类
Object类型的引用变量可以指向任何类型对象
2.2 toString方法
如何重写toString方法
·Object类中重要的方法,用于返回对象值的字符串表示;
·原则上建议重写,格式大多数遵循"类的名字[域值]":eclipse已经集成 了生成toString的快捷方式
·如果不重写toString方法,将使用Object的toString方法,其逻辑为:
-类名@散列码
·toString是非常有用的调试工具
·JDK的标准类库中,许多类都定义了toString方法,方便用户获得有关对象状态的必要信息;
·强烈建议为自定义的每一类增加toString方法
2.3equals方法
equals方法
·Object中的方法,作用在于检测一个对象是否等于另一个对象
·在Object类中,这个方法判断两个对象是否具有相同的引用,即是否为相同的对象;
·在实际应用中,一般需要重写该方法,通过比较对象的成员属性,使该方法更有意义,例如:对于Cells
如果 不重写该方法,下面代码在cell1和cell2指向同一个对象时才为true,可以将其写为:当x和y坐标相等时
两个对象即相等,这样更有意义一些
equals和==的区别
·==用于比较变量的值,可以应用任意类型,如果应用于引用类型,则比较的是两个引用变量
中存储的值(地址信息),判断两个变量是否指向相同的对象
·equals是Object的方法,重写以后,可以用于判断两个对象的内容是否相等
·需要注意的是,Object默认的equals方法的比较规则同==
@Test
public void testEquals() {
//String中重写equals方法,用于判断两个字符串对象的字符序列是否相等
//也就是比较两个字符串的内容是否相等
String string = "abc";
String string2 = "abc";
String string3 = new String("abc");
String string4 = new String("abc");
System.out.println(string.equals(string2));
System.out.println(string == string2);
System.out.println(string.equals(string3));
System.out.println(string == string3);
System.out.println(string3.equals(string4));
System.out.println(string3 == string4);
System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
//Object中的equals方法
Tester tester1= new Tester(4);
Tester tester3 = tester1;
Tester tester2 = new Tester(4);
System.out.println(tester1.equals(tester3));//true
//因为此时该类未重写equals方法,所以调用的是Object类中的equals方法
//所以此时equals作用同==一样,均比较两个对象是否为同一个对象,而不是比较两个对象属性值相等
System.out.println(tester1.equals(tester2));//false
System.out.println(tester1 == tester2);//false
}
1、包装类概述
·在进行类型转换的范畴内,有一种特殊的转换,需要将int这样的基本数据类型转换为对象
·所有基本类型都有一个与之对应的类,即为包装类(wapper)
包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值;
包装类是final的,不允许继承
2、8种基本数据类型包装类
·Number及其主要方法
·抽象类Number是Byte、Short、Inteager、Long、Float、Double类的父类
·Number的子类必须实现将表示的数值转换为byte,double,float,int,long,short
的方法:
-doubleValue() 以double的形式返回指定的数值
-intValue() 以int的形式返回指定的数值
-float() 以float的形式返回指定的数值;
/**
* 测试Number的intValue方法和doubleValue方法
*/
@Test
public void testIntValueAndDoubleValue() {
Number d = 12.34;
Number n = 123;
//输出d和n对象所属的类型
System.out.println(d.getClass().getName());//java.lang.Double
System.out.println(n.getClass().getName());//java.lang.Integer
//将n转换成基本数据类型int,将d转换成基本数据类型double
int intValue = n.intValue();
Double doubleValue= d.doubleValue();
System.out.println("intValue:"+intValue+",doubleValue:"+doubleValue);
//将n转换成基本数据类型int,将n转换成基本数据类型double
intValue = n.intValue();
doubleValue = n.doubleValue();
System.out.println("intValue:"+intValue+",doubleValue:"+doubleValue);
//将d转换成基本数据类型int,将d转换成基本数据类型double
intValue = d.intValue();
doubleValue = d.doubleValue();
System.out.println("intValue:"+intValue+",doubleValue:"+doubleValue);
}
3、Integer常用功能
/**
* Integer常用功能
* ·该类提供了多个方法,能在int类型和String类型之间相互转换
*/
@Test
public void testInteager() {
String str = "123";
int value = Integer.parseInt(str);
System.out.println(value);//123
//如果字符串的格式不是整数形式,将无法转换
str = "中国加油";
value = Integer.parseInt(str);
//会抛出异常 NumberFormatException
// System.out.println(value);
}
4、Double常用功能
/**
* Double常用功能
* ·在double类的对象中包装一个基本类型double的值
* ·构造方法
* - Double(double value)
* - Double(String s)
* ·方法
* - double doubleValue() 返回此Double对象的double值
* - static double parseDouble(String s)返回一个新的double值,该值被初始化为用指定的String表示的值
*
*/
@Test
public void testDouble() {
String string = "12345.88";
double d = Double.parseDouble(string);
Double double1 = new Double(123.11);
d = double1.doubleValue();
}
5、自动装箱和拆箱
/**
* 自动装箱和拆箱
*
* 装箱和拆箱是依靠jdk5的编译器在编译期的“预处理”工作
* 装箱:基本数据类型--》包装类
* 拆箱:包装类--》基本数据类型
*
* 装箱和拆箱是编译器认可的,不是虚拟机,编译器在生成类的字节码时加入必要的方法调用
* -Integer a = 100 -->Integer a =Inteager.valueOf(100)
*/
@Test
public void testAutoBoxing() {
Integer a = 12;//装箱:-Integer a = 100 -->Integer a =Inteager.valueOf(12)
Integer b = 13;//装箱:-Integer b = 100 -->Integer b =Inteager.valueOf(13)
//Integer c = a+b-->Integer c =Inteager.valueOf(a.intValue()+b.intValue())
Integer c = a+b;//拆箱后再装箱
double d = c;//拆箱:int d = c.intVAlue()
}