正则表达式不是java的东西,它是独立的一套体系,它可以描述字符串的规则,格式上的规则,通用匹配。java写了一套库来支持正则表达式,其他的语言也可以使用正则表达式,所以不是java的专利。
Java核心API
Java SE 01 day02
****************************************************************************
API接受。
开发工具:
Ctrl+F 查找
Regular expressions正则表达式
Find:String(最简单的正则,字符串)
Case sensitive大小写严格区分(勾上) 原则上正则区分大小写的
找s开头后面跟数字的变量找出聊
Find:s[0123456789]或s[0-9]或s\d
正则提供的语法:s---第一个字符是s;
[]---方括号所在的一个字符、字符集;里面表示可能出现的情况
测试字符集合
字符串提供,可以检查前面的字符串是否符合这个regex1正则规则?
matches
****************************************************************************
package day02;
public class RegDemo01{
public static void main(String[] agrs){
String reg= "[abc]";
/*
* Java String API 方法matches()
* 用于测试字符串整体是否符合正则规则:
* 检查"a"是否符合[abc]规则
*/
boolean b= "a".matches(reg);
System.out.println(b); //true
reg="s\\d"; //前面那一杠是转移符"\" s[0-9] s[0123456789]
System.out.println(reg); //s\d
b="s1".matches(reg);
System.out.println(b); //true
reg="s\\s";
b="s ".matches(reg);
System.out.println(b); //true
b="sb".matches(reg);
System.out.println(b); //false
b="s\t".matches(reg); //t-tab
System.out.println(b); //true
b="s\n".matches(reg); //n-空白字符
System.out.println(b); //true
}
}
****************************************************************************
邮政编码:(6个数)
[0-9][0-9][0-9][0-9][0-9][0-9]
\d\d\d\d\d\d
\d{6}---数量词
s{6}
\w{8,} 无上限
\w{8,10} 至少8,最多10
****************************************************************************
package day02;
public class RegDemo02{
public static void main(String[] agrs){
/*
*正则表达式数量词
* {n}表示n个
* {n,}至少n个
* {n,m} 至少n个最多m个
* \d{6}:6位数字
* \w{8,}:最少8个单词字符
* \w{8,10} :8~10个单词字符
* s{6}:6个s
*/
String reg="\\d{6}"; // \d{6}
boolean b= "650201".matches(reg);
System.out.println(b); //true
b= "650000".matches(reg);
System.out.println(b); //false
String reg="\w{8,}";
int c="yangrong".matches(reg);
System.out.println(c); //--------------------?
}
}
****************************************************************************
package day02;
public class RegDemo03{
public static void main(String[] agrs){
/*
* 简化的数词
* ? 等价于{0,1}
* * 等价于{0,}
* + 等价于{1,}
*
* 案例:
* s? 没有或者有1个s
* s* 没有或者有很多s
*/
String reg="s?";
boolean b= "s".matches(reg);
System.out.println(b); //true
b= "".matches(reg);
System.out.println(b); //true
b= "ss".matches(reg);
System.out.println(b); //false
}
}
****************************************************************************
01:41:35
1703此账号被封,以下是范传奇讲
回顾:jsd1705
字符串是不变对象、常量池,java是根据常量池的机制能够让我们重用字符串对象,来减少字符串使用内存开销问题。
但是,由于强制要求我们在使用字面量时赋值重用对象的时候,把对象变成公用的,所以对象是不变的,内容是不可以改的。要改的话,就必须创建新对象。
频繁创建对象,字符串性能会很差。类:StringBuilder
字符串支持表达式相关的方法
什么是正则表达式?不是Java的东西,人家有一套自己独特的体系,完善的东西。java提供相关方法来支持使用正则表达式,其他语言也可以使用。
用一堆字符组成的表达式,它是用来描述字符串的格式的。格式匹配验证字符串的一种工具。
****************************************************************************
AM 字符串支持正则表达式
正则表达式不是java的东西,它是独立的一套体系,它可以描述字符串的规则,格式上的规则,通用匹配。java写了一套库来支持正则表达式,其他的语言也可以使用正则表达式,所以不是java的专利。
因为它有一套独立的体系,所以相对复杂。我们学习正则表达式的目的,就是能够看懂,能写基本的正则表达式就够了。
人脑第一反应,一个邮箱的格式应该是什么样的,应该是前面有用户名、中间有个@、后面有个域名.com.
我们不要给正则表达式施加不属于他们的范围?
正则表达式不关注有效性,只关注格式对不对。具体值不关注。
正则表达式
一、字符集合:
[]方括号:表示一个字符,方括号中可以列举这个字符是什么。
[abc]:这是一个字符,而这个字符要么是a、b、c,只能是其中之一,其他不行。
[^abc]:^非
[a-z]:-到
[a-zA-Z0-9]:可以是大小写,也可以是数字,只能表示其中之一。
[a-z&&[^bc]]:a到z,但不包含b、c=[ad-z]
二、预订义字符集:
. 任意一个字符(空格也算)
\d=[0-9]
\w=[a-zA-Z0-9_] 数字、字母、下划线
\s=[\t\n\xOB\f\r] 任意的空白字符,占位看不见的 java里用Trim可以去掉的。
大写和小写反向关系(把小写记住)
\D
\W
\S
三、数量词:
X? ?表示0个或1个X; 表示前面X出现要么有,要么没有。(绝对)
例如:[a-z]? ---两个小写字母就不行。
X* *表示0个或任意多个X;
例如:[a-z]*---任意多个字母,但是有数字的不行。
X+ +表示1个到任意多个X(大于等于1个X)----一次以上,一个都不写就不行。
确定的量词:
X{n} 表示n个X
X{n,} 表示n个到任意多个X(大于等于n个X)
X{n,m}表示n个到m个X
[abc]?
[abc]*
[abc]+ 必须至少写一次
[abc]{3,} 3次以上
[abc]{3,5} 3到5次
最多三次
[abc]{0,3} 写负数也不行,最小值就是0
四、分组"()":
"()":把里面的内容看成一个整体。
[abc]{3}
abb
abc
acc
(abc){3}
abcabcabc
(abc|def){3}
abcdefabc
邮箱地址:
[email protected]
用户名 @ 域名
用户名:数字、字母、下划线
[a-zA-Z0-9_]+:加号表示前面的东西至少写一个。
@:只是@,就确定死。没有必要写[@],[]表示一个字符,里面是允许是什么。
域名:数字、字母、下划线
.cn/.com: .(cn|com|...tt|.com.cn)
点啥:(\.[a-zA-Z]+)
*************************************************************************
package day02;
/**
* 正则表达式:
* 正则表达式是用一组特殊字符描述的一个表达式,表述一个字符串的格式,
* 然后用这个表达式来验证某个字符串是否符合该格式要求。
*
* 字符串支持正则表达式的相关方法之一:
* boolean matches(String regex)
* 该方法是用给定的正则表达式验证当前字符串是否满足格式要求,满足则返回true。
* 这里需要注意,正则表达式就算不添加边界匹配符(^...$),也是做全匹配验证。
* @author Daisy.yang
*/
public class String_mathes{
public static void main(String[] args) {
String email= "[email protected]";
/**
*email的正则表达式:
*[a-zA-Z0-9_.][email protected][a-zA-Z0-9]+(\.[a-zA-Z]+)+
*
*\\
*String regex="\\\\"; 正则表达式为:\\
*/
String regex="[a-zA-Z0-9_\\.][email protected][a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
System.out.println(regex);
boolean match=email.matches(regex);
if(match){
System.out.println("是邮箱地址!");
}else{
System.out.println("不是邮箱地址!");
}
}
}
**********************************************************************
**********************************************************************
package day02;
/**
* String[] split(String regex)
* 将当前字符串按照给定正则表达式可以匹配的部分拆分,
* 将拆分后的若干段字符串存入一个数组并返回。
* @author Daisy.y
* 将当前字符串中满足给定正则表达式的部分拆分,
* 将剩下的所有部分以一个数组的形式返回。
* @author Student
*
*/
public class String_split {
public static void main(String[] args) {
String str ="abc123def456ghi789uio";
// String[] data = str.split("\\d+");
String[] word= str.split("[a-z]+");
System.out.println("拆分出"+word.length+"项:"); //4项包括空字符串
//若"[a-z]"就有10项。末尾连续匹配的话,空字符串就不要了。但是,之前的都要。
/*
* \\d表示一个数字;
* \\d+表示连续的数字部分(+表示一次以上);
*/
// str.split("[0-9]");
for(int i=0;i<word.length;i++){
System.out.println(word[i]);
}
}
}
*************************************************************************
*************************************************************************
package day02;
/**
* 图片重命名:
* 网上传图片,传上去图片名字被改了。gif
* @author Daisy.yang
*
*/
public class String_split2 {
public static void main(String[] args) {
String imgName="123.jpg";
/*
* 打桩:先输出看看对不对?
* "."表示任意一个字符,在正则表达式中。
* 输出结果为0。
*/
String[] names= imgName.split("\\.");
System.out.println(names.length); //0
imgName= System.currentTimeMillis()+"."+names[1];
System.out.println(imgName);
}
}
**************************************************************************
**************************************************************************
package day02;
/**
* String replaceAll(String regex,String str)
* 将当前字符串中,满足正则表达式的部分替换为给定字符串
* @author Daisy.y
*
*/
public class String_replaceAll {
public static void main(String[] args) {
String str="aaa123bbb456ccc789ddd";
/*
* 将数字部分替换为"#NUMBER#"
* [0-9]:每个数字都num一次。
* [0-9]+:若是不加加号,就变为每个数字都num一次。
*
* [0-9].:aaa#NUM##NUM#bb#NUM##NUM#cc#NUM##NUM#dd
* (有问题,木有这种写法O(∩_∩)O哈哈~)
*/
str= str.replaceAll("[0-9].","#NUM#");
System.out.println(str);
/*
* 将字母部分替换为"#CHAR#"
*/
// str=str.replaceAll("[a-z]+","#CHAR#");
}
}
***********************************************************************
replaceAll2:
玩游戏的时候,会用。说的话,有点过激。服务器帮你和谐了。
服务器有一个非常庞大的正则表达式库,会把曾经使用过的不好的用语统计出来,所有的用语过来后
replaceAll再发给对方看。
GM在上班的时候,就盯着有人给你举报,就在和谐用语库里面加上一条骂人的新用语。
正则表达式是动态拼接的。
等下次开机就被和谐啦!
***********************************************************************
package day02;
/**
* 和谐用语
* @author Daisy.y
*
*/
public class String_replaceAll2 {
public static void main(String[] args) {
/*
* ()圆括号:词组,中间内容,|或。
*/
String regex="(s13|w q n m l g b|nc|cnm|mdzz|djb|sb|nmlgb)";
String message="wqnmlgb!你这个djb!你怎么这么nc!cnm!s 13";
message=message.replaceAll(regex, "***");
System.out.println(message);
}
}
**********************************************************************
package day02;
import java.util.Scanner;
/**
* 程序启动后,要求用户输入邮箱地址,
* 然后检验该邮箱格式是否正确,若不正确输出:
* 您输入的邮箱格式有误,请重新输入。
* 当输入正确之后输出一句话:
* 您好![user],您使用的邮箱域名为[host]
*
* 例如:[email protected]
* 输出:您好!fancq,您使用的邮箱域名为tedu。
* @author Student
*
*/
public class Test {
public static void main(String[] args) {
Scanner scanner= new Scanner(System.in);
String email= null;
while(true){
System.out.println("请输入您的邮箱地址:");
email= scanner.nextLine();
if(matches(email)){
break;
}
System.out.println("您输入的邮箱格式不正确!");
}
//获取用户名:[email protected]
String[] data= email.split("@");
String username= data[0];
//tedu.cn
String hostname= data[1].substring(0,data[1].indexOf("."));
System.out.println("您好!"+username+",您使用的邮箱域名为:"+hostname );
}
/**
* 验证给定的邮箱是否符合格式的要求
* @param email
* @return
*/
public static boolean matches(String email){
/*
* "[a-zA-Z0-9_\\.][email protected][a-zA-Z0-9]+(\\.[a-zA-Z]+)+"
*/
String regex="[a-zA-Z0-9_\\.][email protected][a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
return email.matches(regex);
}
}
***********************************************************************
PM
object
Java中所有的类都是object的子类,除了它自己外(硬性指标要求)。
分为两种:直接或间接的。
java的三个特性:封装、继承、多态。
多态:多种形态,行为、对象多态。父类的接收子类的就是多态。
子类和父类哪个先有?
答:先有子类。
世界上先有了老虎、猫、豹子、狮子,人类才发现它们有共同的特征,抽象出来的东西叫:猫科动物。
没有提供猫科动物的时候,没有猫、老虎、狮子???有啊!
所以人类才抽象出一个东西叫猫科动物的。
往后就抽象抽象最后到了顶层。越到顶层越少,金字塔。
介绍java中的其他类库
Object(对象、东西)一切皆对象,一切皆东西。
类(属性、方法)
属性:特征,区别,区分你我
方法:行为,你会干啥
将来在写程序的时候,我们不会是先想到父类再想到子类,恰恰是反过来。
先想子类,后想父类。就像现实生活中,见到的事物多了,开始总结才抽象出父类的。
重构代码:
先把功能实现出来,在重构的时候再总结,之间的类有哪些共性,再提出父类。
越到父类,方法越少。
java在定义object方法时很谨慎的。
******************************************************************************
package day02;
/*
* 正常的会写extends,这里什么都不写。但是默认为已经继承object。
* 只是源代码没有,编译器在给你编译成class文件的时候.
* Java中所有的类都是object的子类,除了它自己外(硬性指标要求)。
* Why???????????????????????
*
*/
public class Demo extends Object{
public static void main(String[] args) {
Object o= new Demo();
o.toString();
}
}
*******************************************************************************
package day02;
/**
* 自己的钱包、年龄是私有属性。
* 私有属性:直接看不见,想要用问我。
* private外界看不到了,在想引用某人的钱包,引用不到了。
* @author Student
* 属性私有,行为公有化。
*
*/
public class Person {
private int age;
public void setAge(int age){
if(age>100||age<0){
return;
}
this.age=age;
}
public int getAge(){
return age;
}
}
***************************************************************************
package day02;
public class TestPerson {
public static void main(String[] args) {
Person p= new Person();
p.setAge(10000);
System.out.println(p.getAge());
}
}
**************************************************************************
获取set、get
空白处:鼠标右键--->source--->Generate Getters and Setters...--->类的属性select all
**************************************************************************
package day02;
/**
* java中所有的类都继承自Object
* 当我们定义的一个类没有使用extends继承任何类时,编译器
* 在编译时会自动让当前类继承自Object
*
* 使用该类测试重写Object的相关方法
* @author Daisy.yang
*
* Point直角坐标上的点:X,Y;
* 属性私有化,行为公开化。
*
*/
public class Point {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
****************************************************************************
package day02;
/**
* 测试Point重写的Object相关方法
* @author Daisy.y
*
*/
public class TestPoint {
public static void main(String[] args) {
Point p= new Point();
p.setX(1);
p.setY(2);
String str= p.toString();
System.out.println(str); //[email protected]堆里的地址
}
}
*****************************************************************************
怎么重写toString????
*****************************************************************************
package day02;
/**
* java中所有的类都继承自Object
* 当我们定义的一个类没有使用extends继承任何类时,编译器
* 在编译时会自动让当前类继承自Object
*
* 使用该类测试重写Object的相关方法
* @author Daisy.yang
*
* Point直角坐标上的点:X,Y;
* 属性私有化,行为公开化。
*
*/
public class Point {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
/**
* 通常需要用到一个类的toString方法时,就应当
* 重写该方法。因为Object提供的该方法返回的字符串
* 是该对象的句柄(地址信息)
*
* toString方法返回的字符串应当包含当前对象的
* 属性信息。具体格式结合实际需求而定。
*/
public String toString(){
return"("+x+","+y+")";
}
/**
* equals方法的作用是比较当前对象与参数给定的对象
* 内容是否一致。即:两个对象“像不像”
*
* 若不重写该方法,则使用Object提供的,但是Object
* 提供的equals方法内部比较原则就是“==”,所以不具备实际意义。
*
* equals方法并不要求两个对象所有属性值必须完全一样,
* 结合实际业务逻辑需求定义判断标准。
*/
public boolean equals(Object obj){
if(obj==null){
return false;
}
if(obj==this){
return true;
}
if(obj instanceof Point){
Point p=(Point)obj;
return this.x==p.x&&this.y==p.y;
}
return false;
}
}
***********************************************************************
package day02;
/**
* 测试Point重写的Object相关方法
* @author Daisy.y
*
*/
public class TestPoint {
public static void main(String[] args) {
Point p= new Point();
p.setX(1);
p.setY(2);
// String str= p.toString();
// System.out.println(str); //[email protected]堆里的地址
/*
* System.out.println(Object obj)
* 该方法会将给定对象的toString方法返回值
* 输出到控制台
*/
System.out.println(p);
Point p2= new Point();
p2.setX(1);
p2.setY(2);
System.out.println(p2);
System.out.println(p==p2); //---???false
System.out.println(p.equals(p2)); //---???false???是object提供的。---true
}
}
**************************************************************************
equals方法:
字符串里的equals比的是内容,equals和==的区别就在这里了。
代码以上又讲。
***************************************************************************
2:05基本类型有一个问题:
IntegerDemo.java
**************************************************************************