第十章、正则表达式

第十章、正则表达式

1. 基本概述

由事先定义好的特殊字符以及这些特殊字符组成,组成一个“规则的表达式”,这是表达式用来
对字符串进行过滤逻辑。

2. 语法格式

Java中正则表达式的语法格式:""
 
JS中正则语法格式:/ /

3. 运用场景

1.检测用户输入的合法性
2.检索、替换文本

4. 正则表达的组成

由普通字符和特殊字符(元字符)组成。
 
 
字符
    x       字符 x  。  举例:'a'  表达式字符a
    \      反斜杠字符
    
      换行
    
      回车符
 
 
字符类
    [abc]       表示abc中任意单个字符
    [^abc]      表示除了abc任意单个字符
    [a-zA-Z]    表示a到z A到Z中任意单个字符
    [0-9]       表示0-9任意单个字符
 
 
预定义字符类
    .           除了换行符以外的任意单个字符。    我的就是.字符本身,怎么表示呢? .
    d          数字[0-9]
    D          非数字: [^0-9]
    w          数字字母下划线[a-zA-Z_0-9]
    W          非单词字符:[^w]
    s          空白字符
    S          非空白字符:[^s]
 
边界匹配器
    ^           开头
    $           结尾
              单词边界
 
 
数量词
    X?          表示X可以出现一次或一次也没有
    X*          零次或多次
    X+          一次或多次
    X{n}        恰好 n 次
    X{n,}       至少 n 次
    X{n,m}      至少 n 次,但是不超过 m 次
 
 
特殊符号
    ()          子字符集
    |           或
    &&          与
               转义字符
 
    ?           设置括号内的选项是可选的

5. 代码示例

  • 演示正则表达式用法

    package day15;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /*
     * 演示正则表达式用法
     */
    public class Regex1 {
    
    	public static void main(String[] args) {
    		
    		// 1.编写正则表达式,匹配abc找那个任意三个字符
    		String reg1 = "[abc]$";
    		
    		// 2.编写正则表达式匹配abc中任意3个字符
    		
    		String reg2 = "[abc]{3}";
    		// 3.编写正则表达式匹配字母数字,要求出现0次或1次
    		String reg3 = "[0-9a-bA-Z]?";
    		// 4.编写正则表达式匹配字母数字下划线
    		String reg4 = "\w";
    		
    		// 出现一个问题  表达式写好了,该如何自定义字符串进行匹配呢?
    		
    		System.out.println("---------第一种匹配方式---------");
    		boolean bool = "adc".matches(reg1);
    		System.out.println(bool);
    		bool = "acc".matches(reg2);
    		System.out.println(bool);
    		
    		System.out.println("---------第二种匹配方式---------");
    		bool = Pattern.matches(reg3, "9");
    		System.out.println(bool);
    		
    		System.out.println("---------第三种匹配方式---------");
    		// compile(String regex)   将给定的正则表达式编译到模式中
    		
    		// 将给定的正则表达式编译到模式中
    		Pattern pattern = Pattern.compile(reg4);
    		// Matcher matcher(CharSequence input)  创建匹配给定输入与此模式的匹配器
    		
    		// 创建匹配给定输入与此模式的匹配器
    		Matcher matcher = pattern.matcher("6");
    		// 尝试将整个区域与模式匹配
    		bool = matcher.matches();
    		System.out.println(bool);
    	}
    }
    
  • 作业一

    package day15;
    
    /*
     * 1.验证用户名 字母开头4-6位,数字字母下划线
     * 2.手机号11位
     * 3.验证QQ号码        3-13位
     * 4.验证邮箱
     * 5.验证身份证
     * 6.验证用户2-4位汉字
     * 7.验证用户名		数字字母必须都包含
     */
    public class Regex2 {
    
    	public static void main(String[] args) {
    		// 1.验证用户名 字母开头4-6位,数字字母下划线
    		String reg1 = "^[a-zA-Z]\w{3,5}";
    		boolean bool = "sd_3".matches(reg1);
    		System.out.println(bool);
    		
    		System.out.println("----------------------");
    		// 2.手机号11位
    		String reg2 = "\d{11}";
    		bool = "15879680697".matches(reg2);
    		System.out.println(bool);
    		
    		System.out.println("----------------------");
    		// 3.验证QQ号码        3-13位
    		String reg3 = "\d{3,13}";
    		bool = "15879680697".matches(reg3);
    		System.out.println(bool);
    		
    		System.out.println("----------------------");
    		// 4.验证邮箱
    		String reg4 = "[a-zA-Z0-9]+@[a-zA-Z]+\.com";
    		bool = "158796df@qq.com".matches(reg4);
    		System.out.println(bool);
    		
    		System.out.println("----------------------");
    		// 5.验证身份证
    		String reg5 = "[0-9]{18}";
    		bool = "362401200003214417".matches(reg5);
    		System.out.println(bool);
    		
    		System.out.println("----------------------");
    		// 6.验证用户2-4位汉字
    		String reg6 = "[u4e00-u9fa5]{2,4}";
    		bool = "娃哈哈".matches(reg6);
    		System.out.println(bool);
    		
    		System.out.println("----------------------");
    		// 7.验证用户名		数字字母必须都包含
    		// ?![0-9]$     ?![a-zA-Z]$
    		String reg7 = "(?![0-9]+$)(?![a-zA-Z]+$)[0-9a-zA-Z]*";
    		bool = "asjfvf".matches(reg7);
    		System.out.println(bool);
    		
    		System.out.println("----------------------");
    		// 8.验证用户名		数字字母下划线必须都包含
    		// ?![0-9]$     ?![a-zA-Z]$
    		String reg8 = "(?![0-9]+$)(?![a-zA-Z]+$)(?![0-9a-zA-Z]+$)[0-9a-zA-Z_]*";
    		bool = "asjfv2_f".matches(reg8);
    		System.out.println(bool);
    	}
    }
    
  • 作业二

    package day15;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /*
     * 获取功能
     * 		获取下面这个字符串中由三个字符组成的单词
     * 		q xue wan gaoji wo gei ni men jie shao dui xiang,ni men ji bu ji dong?
     */
    public class RegexCase {
    
    	public static void main(String[] args) {
    		// 定义字符串
    		String string = "q xue wan gaoji wo gei ni men jie shao dui xiang,ni men ji bu ji dong?";
    		
    		// 1.创建正则表达式撇三个字符组成的单词  \b:是边界符
    		String reg = "\b[a-zA-Z]{3}\b";
    		
    		Pattern compile = Pattern.compile(reg);
    		Matcher matcher = compile.matcher(string);
    		
    		// find() 查找 与正则匹配的字符序列
    		while(matcher.find()){
    			
    			// 开始的索引/偏移量
    			int start = matcher.start();
    			
    			// 接收的索引/偏移量
    			int end = matcher.end();
    			
    			// 获取到查询的这一组数据
    			String group = matcher.group();
    			
    			System.out.println(start+"   "+group+"    "+end);
    		}
    	}
    }
    
  • 替换功能

    package day15;
    
    /*
     * 替换功能
     * 		public String replaceAll(String regex,String replacement)
     * 		使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串
     */
    public class RegexReplaceAll {
    
    	public static void main(String[] args) {
    		
    		// 定义一个字符串
    		String str = "riroekjrghjir493t8";
    		
    		// 需求:去掉所有的数字,用*替换
    		String reg = "\d"; // 将单个数字替换成一个指定的字符
    		//String reg = "\d+"; // 将一组数字替换成一个指定的字符
    		
    		String string = str.replaceAll(reg, "*");
    		System.out.println(string);
    	}
    }
    
  • 分割功能

    package day15;
    
    import java.util.Scanner;
    
    
    /*
     * 分割功能
     * 		public String[] split(String regex)
     * 		根据给定的正则表达式匹配此字符串
     */
    public class RegexSplit {
    
    	public static void main(String[] args) {
    		// 给定一个年龄范围
    		String ages = "18-24";
    		
    		String reg = "-";
    		
    		String[] split = ages.split(reg);
    		
    		for (int i = 0; i < split.length; i++) {
    			System.out.println(split[i]);
    		}
    		int startAge = Integer.parseInt(split[0]);
    		int endAge = Integer.parseInt(split[1]);
    		
    		// 键盘录入年龄
    		System.out.println("先输入你的年龄:");
    		Scanner scanner = new Scanner(System.in);
    		int age = scanner.nextInt();
    		if(age >=startAge && age <=endAge){
    			System.out.println("可以培养培养!");
    		}else{
    			System.out.println("你是个好人!");
    		}
    	}
    }
    
原文地址:https://www.cnblogs.com/borntodie/p/14092753.html