zoukankan      html  css  js  c++  java
  • JAVASE01---Unit02: 正则表达式 、 Object 、 包装类

    正则表达式不是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]或sd
    正则提供的语法: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); //sd
    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 ".matches(reg); //t-tab
    System.out.println(b); //true

    b="s ".matches(reg); //n-空白字符
    System.out.println(b); //true

    }
    }
    ****************************************************************************
    邮政编码:(6个数)
    [0-9][0-9][0-9][0-9][0-9][0-9]
    dddddd
    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=[ xOBf ] 任意的空白字符,占位看不见的 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


    邮箱地址:
    fancq@tedu.cn
    用户名 @ 域名

    用户名:数字、字母、下划线
    [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= "Daisy.yang913@i2edu.com.cn";
    /**
    *email的正则表达式:
    *[a-zA-Z0-9_.]+@[a-zA-Z0-9]+(.[a-zA-Z]+)+
    *
    *\
    *String regex="\\"; 正则表达式为:\
    */
    String regex="[a-zA-Z0-9_\.]+@[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]
    *
    * 例如:fancq@tedu.cn
    * 输出:您好!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("您输入的邮箱格式不正确!");
    }
    //获取用户名:fancq@tedu.cn
    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_\.]+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+"
    */
    String regex="[a-zA-Z0-9_\.]+@[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); //day02.Point@15db9742---堆里的地址

    }
    }
    *****************************************************************************
    怎么重写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); //day02.Point@15db9742---堆里的地址

    /*
    * 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
    **************************************************************************

  • 相关阅读:
    高精度A+B
    基本定积分求面积
    二进制算子集和
    linux命令
    Dubbo
    java 集合区别
    Java中Comparable和Comparator区别
    synchronized实现原理
    ThreadLocal 原理
    java volatile关键字
  • 原文地址:https://www.cnblogs.com/sneg/p/7818725.html
Copyright © 2011-2022 走看看