天天看點

正規表達式(操作字元串)

正規表達式主要是操作字元串的規則,正規表達式對字元串的操作主要有以下幾種應用:

   比對 matches:

    切割 split:

   替換replaceAll(String regex, String replacement):

    查找:

        指定為字元串的正規表達式必須首先被編譯為此類的執行個體。然後,可将得到的模式用于建立 Matcher 對象,

        依照正規表達式,該對象可以與任意字元序列比對。執行比對所涉及的所有狀态都駐留在比對器中,

        是以多個比對器可以共享同一模式。  是以,典型的調用順序是 

             Pattern p = Pattern.compile("正則");

             Matcher m = p.matcher("aaaaab");

             boolean b = m.matches();

查找需要使用的對象:

            1.Pattern(正則對象)

            2.Matcher(比對器對象)

比對器要使用的方法:

            1.find()   通知比對器去比對字元串,查找符合規則的字元串的子串。如果能查找到符合規則的字元串,則傳回true,否則傳回false。

            2.group()  擷取符合規則的子串 

package com.cn.regex;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Author:Liu Zhiyong(QQ:1012421396)
* Version:Version_1
* Date:2016年7月20日10:02:06
* Desc:
正規表達式主要是操作字元串的規則,正規表達式對字元串的操作主要有以下幾種應用:
  比對 matches:
  
  切割 split:
  
  替換replaceAll(String regex, String replacement):
  
  查找:
    指定為字元串的正規表達式必須首先被編譯為此類的執行個體。然後,可将得到的模式用于建立 Matcher 對象,
    依照正規表達式,該對象可以與任意字元序列比對。執行比對所涉及的所有狀态都駐留在比對器中,
    是以多個比對器可以共享同一模式。  是以,典型的調用順序是 
       Pattern p = Pattern.compile("正則");
       Matcher m = p.matcher("aaaaab");
       boolean b = m.matches();
    查找需要使用的對象:
      1.Pattern(正則對象)
      2.Matcher(比對器對象)
    比對器要使用的方法:
      1.find()   通知比對器去比對字元串,查找符合規則的字元串的子串。如果能查找到符合規則的字元串,則傳回true,否則傳回false。
      2.group()  擷取符合規則的子串 
        注意:使用group方法的時候一定要先調用find方法讓比對器去查找符合規則的字元串,否則報錯。
    
*/
public class Demo3 {
  
  public static void main(String[] args) {
    String phone = "18071897425";
    matchesPhone(phone);
    
    phone = "0713-29962208";
    matchesTel(phone);
    
    String str = "請                  叫      我   木      丁   西";
    split1(str);
    
    str = "請叫叫叫叫叫叫叫我木丁丁丁丁丁丁丁丁丁西";  //請  我木  西
    split2(str);
    str = "如有需求請聯系我:18071897425如有需求請聯系我:18071897425如有需求請聯系我:18071897425如有需求請聯系我:18071897425"
        + " 如有需求請聯系我:18071897425如有需求請聯系我:18071897425如有需求請聯系我:18071897425如有需求請聯系我:18071897425";
    String replacement = "***";
    replaceAll1(str, replacement);
    
    str = "我我我要要要做做項項項項項項項項項項項項項目目";//還原成:我要做項目    把重疊詞替換成單個詞
    replacement = "\\1";
    replaceAll2(str, replacement);
    
    pattern();
  }
  //正則對象
  public static void pattern() {
    String str;
    //正則對象。。。。。查找
    //找出3個字母組成的單詞
    str = "Qing jiao wo mu ding xi, hen gao xing ren shi ni men";
    //先要把字元串的正則編譯成正則對象
    Pattern p = Pattern.compile("\\b[a-zA-Z]{3}\\b");//加上了邊界比對器
    //使用正則對象比對字元串産生一個比對器對象
    Matcher m = p.matcher(str);
    System.out.println("有符合的字元串嗎?" + m.find());;
    while(m.find()){
      System.out.print(m.group() + "\t");
    }
  }
  
  /**
   *需求1:編寫一個正規表達式比對手機号。
   *1.第一位:1
   *2.第二位:3 4 5 7 8
   *3.長度:11位
   * @param phone
   */
  public static void matchesPhone(String phone) {
    String regex = "1[34578]\\d{9}";
    System.out.println(phone.matches(regex)?"号碼格式正常":"非法手機号");
  }
  
  /**
   * 需求2:比對固定電話
   *  區号-主機号
   * 1.區号:首位為0 。。長度3~4位
   * 2.主機号:首位不能為0。。長度7~8位
   * @param tel
   */
  public static void matchesTel(String tel){
    String regex = "0\\d{2,3}-[1-9]\\d{6,7}";
    System.out.println(tel.matches(regex)?"合法固定電話":"非法固定電話");
  }
  
  /**
   * 按照空格切割
   * @param str
   */
  public static void split1(String str){
    String regex = " +";
    String[] strs = str.split(regex);
    System.out.println(Arrays.toString(strs));
  }
  
  /**
   * 根據重疊詞進行切割
   * @param str
   */
  public static void split2(String str){
    String regex = "(.)\\1+";//如果正則的内容需要被複用,那麼需要對正則的内容進行分組。分組的目的就是為了提高正則的複用性。組号不能指定,組号從1開始。
    String[] strs = str.split(regex);
    System.out.println(Arrays.toString(strs));
  }
  
  /**
   * 替換
   * @param str
   */
  public static void replaceAll1(String str, String replacement){
    String regex = "1[34578]\\d{9}";
    str = str.replaceAll(regex, replacement);//傳回值就是替換後的結果
    System.out.println(str);
  }
  
  /**
   * 替換
   *    如果需要在replaceAll方法正則的外部引用組的内容,那麼是使用"$組号"   
   * @param str
   * @param replacement
   */
  public static void replaceAll2(String str, String replacement){
    String regex = "(.)\\1+";
//    str = str.replaceAll(regex, replacement); //如果需要在replaceAll方法正則的外部引用組的内容,那麼是使用"$組号"   
    str = str.replaceAll(regex, "$1"); //如果需要在replaceAll方法正則的外部引用組的内容,那麼是使用"$組号"   
    System.out.println(str);
  }
}