天天看点

正则表达式(操作字符串)

正则表达式主要是操作字符串的规则,正则表达式对字符串的操作主要有以下几种应用:

   匹配 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);
  }
}