1. 程式人生 > >JAVASE01---Unit02: 正則表達式 、 Object 、 包裝類

JAVASE01---Unit02: 正則表達式 、 Object 、 包裝類

ren 屬性 年齡 定義 lis ... 重新 描述 bstr

正則表達式不是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_.]+@[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]
*
* 例如:[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_\\.]+@[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
**************************************************************************

JAVASE01---Unit02: 正則表達式 、 Object 、 包裝類