1. 程式人生 > >java基礎---正則表示式

java基礎---正則表示式

package cn.itcast.regex;
/*


正則表示式:正則表示式其實就是用於操作字串的一個規則,正則表示式的規則使用了特殊符號來表示的


需求:校驗一個QQ號。
   1.不能以0開頭。
   2.長度5~11
   3.只能由數字組成
 */
public class Demo1 {


public static void main(String[] args) {
String qq = "ab567";
/*
if(!qq.startsWith("0")){
if(qq.length()>=5&&qq.length()<=11){
try{
Long.parseLong(qq);
System.out.println("恭喜你,你得到了一個合法QQ");
}catch(Exception e){
System.out.println("非法QQ,QQ號只能由數字組成");
}


}else{
System.out.println("非法QQ,QQ號的長度只能是5~11位");
}

}else{
//以0開頭
System.out.println("非法QQ。QQ號不能以0開頭");
}
*/

System.out.println(qq.matches("[1-9]\\d{4,10}")?"合法QQ":"合法QQ");
}



}



package cn.itcast.regex;
/*
 
 預定義字元類 
. 任何字元(與行結束符可能匹配也可能不匹配) 
\d 數字:[0-9] 
\D 非數字: [^0-9] 
\s 空白字元:[ \t\n\x0B\f\r] 
\S 非空白字元:[^\s] 
\w 單詞字元:[a-zA-Z_0-9] 
\W 非單詞字元:[^\w]
注意:任何預定於字元沒有加上數量詞之前都只能匹配一個字元而已。
數量詞:
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n}

X,恰好n次
X{n,} X,至少n次
X{n,m} X,至少n次,但是不超過m次






範圍表示
[abc] a、b 或 c(簡單類) 
[^abc] 任何字元,除了 a、b 或 c(否定) 
[a-zA-Z] a 到 z 或 A 到 Z,兩頭的字母包括在內(範圍) 
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](並集) 
[a-z&&[def]] d、e 或 f(交集) 
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](減去) 
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](減去)


注意:範圍詞裡面不管內容有多長,沒有數量詞的配合都只能匹配一個字元而已
 */
public class Demo2 {


public static void main(String[] args) {

/*
* 預定義字元類
System.out.println("任意字元:"+"%".matches("."));
System.out.println("數字字元:"+"1".matches("\\d"));
System.out.println("任意字元:"+"A".matches("\\D"));
System.out.println("空白字元:"+"\r".matches("\\s"));
System.out.println("非空白字元:"+"\n".matches("\\S"));
System.out.println("單詞字元:"+"_".matches("\\w"));
System.out.println("非單詞字元:"+"%".matches("\\W"));

數量詞
System.out.println("?一次或一次也沒有:"+"1".matches("\\d?"));
System.out.println("* 零次次或多次也沒有:"+"123".matches("\\d*"));
System.out.println("+至少出現一次:"+"1".matches("\\d+"));
System.out.println("{n}恰好出現n次:"+"12345678912".matches("\\d{11}"));

System.out.println("{n,}至少要出現n次:"+"1234567891245".matches("\\d{11,}"));
System.out.println("{n,m}指定出現次數的範圍:"+"12345678912".matches("\\d{11,14}"));
範圍詞
*/
System.out.println("d".matches("[abc]"));
System.out.println("@".matches("[^abc]"));
System.out.println("字元可以出現在a-z之間:"+"d".matches("[a-z0-9]"));
System.out.println("d".matches("[abc]"));


}


}



package cn.itcast.regex;


import java.util.Arrays;


/*
 正則表示式主要是用於字串操作的規則,正則表示式對字串的操作注意有一下幾種應用:
 
 匹配 match()
 
 切割(split):
 
 替換replaceAll(String regex,String replacement):
 
 
 查詢:
 */
public class Demo3 {


public static void main(String[] args) {
//matchesPhone("13556082481");
//matchesTel("020-38325152");
//testPlit1();
//testPlit2();
//replaceTest1();
replaceTest2();


}
//需求:編寫一個正則表示式匹配手機號,第一位只能是1開頭,第二位  :3,5,7,8  長度11位
  
public static void matchesPhone(String phone){

System.out.println(phone.matches("1[34578]\\d{9}")?"合法手機號":"非法手機號");

}
//需求2:匹配固定電話  區號-主機   區號:首位是0  長度:3-4   主機號:首位不能是0,長度7~8

public static void matchesTel(String tel){
System.out.println(tel.matches("0\\d{2,3}-[1-9]\\d{6,7}")?"合法電話號碼":"非法電話號碼");
}
//按照空格切割
public static void testPlit1(){
String str = "明              天       放    假";
String[] datas = str.split("  +");
System.out.println("陣列的元素:"+Arrays.toString(datas));

}

//根據重疊詞進行切割

public static void testPlit2(){
String str1 = "大家家明天天玩得得得得得得得開心";//大明玩開心
String[] datas1 = str1.split("(.)\\1+");//如果正則的內容需要被複用,需要對正則的內容進行分組,()分組的目的就是為了提高正則的複用性。組號不能指定,組號是從1開始
System.out.println("陣列的元素1:"+Arrays.toString(datas1));
}
/*
(.)\\1+       ()分組:分組的目的是為了讓正則的內容被複用起來。組號是從1開始。
                  ((A)(B(C)))
                                                     組號1:((A)(B(C)))
                                                     第二組:(A) 
                                                     第三組:(B(C))
                                                      第四組(C) 
               \1:引用第一組所匹配到的內容。 
                                                      
                                                                                      
*/

//編寫一個正則匹配一個郵箱:首字母a-zA-Z1-9   [email protected]    [email protected]   [email protected]  [email protected]  


//替換
public static void replaceTest1(){
String str2 = "如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123"
+ "如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123如有需求請聯絡我:13556082123";
String reg = "1[34578]\\d{9}";
str2 = str2.replaceAll(reg, "******");
System.out.println("被替換的內容是"+str2);
}


public static void replaceTest2(){
String str = "我我我要要要做做做項項項專案";//還原結巴的話-------->我要做專案,把重疊詞替換成的單個單詞
   str = str.replaceAll("(.)\\1+", "$1");//如果需要在replaceAll方法正則的外部引用組的內容,那麼是使用$組號
   System.out.println(str);

}



}




package cn.itcast.regex;


import java.util.regex.Matcher;
import java.util.regex.Pattern;


/*
 查詢:
 
 指定為字串的正則表示式必須首先被編譯為此類的例項。然後,可將得到的正則物件匹配任意字串用於建立Matcher物件,
 依照正則表示式,該物件可以與任意字元序列匹配。執行匹配所涉及的所有狀態都駐留在匹配器中,所以多個匹配器可以共享同一模式。因此典型的呼叫順序是:
 
     Pattern  p = Pattern.compile("正則");
     Matcher  m = p.matcher("aaaaa")
     boolean  b = m.matches();
 查詢需要使用的物件:
 1.Pattern(正則物件)
 2.Matcher(匹配器物件)
 
 匹配器要使用的方法:
 1.find()通知匹配器去匹配字串,查詢符合規則的字串。如果能查到的符合規則的字串,則返回true,否則返回false;
 
 2.group()獲取符合規則的子串
 
 注意:使用group方法的時候一定要先呼叫find方法讓匹配器去查詢符合規則的字串,否則會報錯的
 
 */
public class Demo4 {


public static void main(String[] args) {
//找出三個字母組成的單詞給我
String  content = "da jia de jia qi wan bi liao hai kai xin ma";
String reg = "\\b[a-zA-Z]{3}\\b";
//先把要字串的正則編譯成Pattern物件
Pattern p = Pattern.compile(reg);
//使用正則物件匹配字串用於產生一個Matcher物件。
Matcher m = p.matcher(content);
/*
System.out.println("有符合規則的字串嗎?"+m.find());
System.out.println("獲取結果:"+m.group());
*/

while(m.find()){
System.out.println(m.group());
}


}


}




package cn.itcast.regex;
/*
 單詞邊界匹配器
 
 \b  單詞邊界匹配器只是代表;額單詞的開始或者是結束部分,不匹配任何的字元
 
 */
public class Demo5 {


public static void main(String[] args) {
System.out.println("hello world".matches("hello\\b world"));


}


}




package cn.itcast.regex;


import java.util.regex.Matcher;
import java.util.regex.Pattern;


/*
網路爬蟲(網路蜘蛛) 
 */
public class Demo6 {


public static void main(String[] args) {
String content = "有事沒事聯絡:[email protected] 有事沒事聯絡:[email protected] 有事沒事聯絡:[email protected] 有事沒事聯絡:[email protected] 有事沒事聯絡:[email protected]  "
                   +"有事沒事聯絡:[email protected]  有事沒事聯絡:[email protected]   有事沒事聯絡:[email protected] " ;

String reg = "[a-zA-Z1-9]\\W{5,17}@[A-Za-z0-9]{2,}(\\.(com|cn|net)){1,2}";
//把字串的正則編譯成正則物件
        Pattern p = Pattern.compile(reg);
        
        //使用正則物件產生匹配器物件
        Matcher m = p.matcher(content);
        while(m.find()){
        System.out.println(m.group());
        }
}


}