Java 正则表达式 概述及案例

Java正则表达式的概述和简单使用

  • A:正则表达式
    • 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
    • 作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个限制长度的事情就是正则表达式做的
  • B:案例
    • 需求:校验qq号码.

      • 1、要求必须是5-15位数字
      • 2、0不能开头
      • 3、必须都是数字
    • 代码演示:

      • a:非正则表达式实现
      • b:正则表达式实现
/**
* A:正则表达式
  * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
  * 作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个限制长度的事情就是正则表达式做的。
* B:案例演示
	* 需求:校验qq号码.
		* 1:要求必须是5-15位数字
		* 2:0不能开头
		* 3:必须都是数字
		
	* a:非正则表达式实现
	* b:正则表达式实现
 */
 /**
 * @author 白白小草
 * @version 1.0
 * @Title: main   
 * @Description: 校验QQ号码
 */
public static void main(String[] args) {
	System.out.println(checkQQ("005825"));
	System.out.println(checkQQ("a3def3"));
	System.out.println(checkQQ("158581"));
	System.out.println(checkQQ("123456321945132156"));
	
	String regex = "[1-9]\\d{4,14}";
	System.out.println("1000000".matches(regex));
	System.out.println("01235".matches(regex));
	System.out.println("359851abbc".matches(regex));
}
/*
 * 需求:校验qq号码.
 * 1:要求必须是5-15位数字
 * 2:0不能开头
 * 3:必须都是数字
 * 校验qq
 * 1,明确返回值类型boolean
 * 2,明确参数列表String qq
 */
public static boolean checkQQ(String qq) {
	//如果校验qq不符合要求就把flag置为false,如果符合要求直接返回
	boolean flag = true;					
	
	if(qq.length() >= 5 && qq.length() <= 15) {
		if(!qq.startsWith("0")) {
			char[] arr = qq.toCharArray();	//将字符串转换成字符数组
			for (int i = 0; i < arr.length; i++) {
				char ch = arr[i];			//记录每一个字符
				if(!(ch >= '0' && ch <= '9')) {
					flag = false;			//不是数字
					break;
				}
			}
		}else {
			flag = false;					//以0开头,不符合qq标准
		}
	}else {
		flag = false;						//长度不符合
	}
	return flag;
}

代码运行结果:
运行结果


字符类

  • A:字符类
字符 简介
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括
预定义字符类
  • A:预定义字符类
字符 简介
. 任何字符。
\d 数字:[0-9]
\w 单词字符:[a-z A-Z 0-9]
\W 非单词字符:[^\w]
\D 非数字: [^0-9]
\s 匹配任何空白字符: [ \f\n\r\t\v] 。
\S 非空白字符:[^\s]
数量词
  • Greedy 数量词
字符 简介
X? X 一次或一次也没有
X* X 零次或多次
X+ X 一次或多次
X{n} X 恰好 n 次
X{n,} X 至少 n 次
X{n,m} X 至少 n 次,但是不超过 m 次

正则表达式的分割功能

  • A:正则表达式的分割功能

    • String类的功能:public String[] split(String regex)
  • B:案例

    • 正则表达式的分割功能
  • 代码演示:

/**
 * @author 白白小草
 * @version 1.0
 * @Title: main   
 * @Description: 正则表达式的分割功能
 */
public static void main(String[] args) {
	String s = "英雄联盟..CS.地下城与勇士";
	String[] arr = s.split("\\.");				//通过正则表达式切割字符串
	
	for (int i = 0; i < arr.length; i++) {
		System.out.println(arr[i]);
	}
}

代码运行结果:
Java 正则表达式 概述及案例_第1张图片

正则表达式的替换功能

  • A:正则表达式的替换功能
    • String类的功能:public String replaceAll(String regex,String replacement)
  • B:案例
    • 正则表达式的替换功能
  • 代码演示:
/**
 * A:正则表达式的替换功能
 * String类的功能:public String replaceAll(String regex,String replacement)
 */
/**
 * @author 白白小草
 * @version 1.0
 * @Title: main   
 * @Description: 正则表达式的替换功能
 */
public static void main(String[] args) {
	String s = "hel111lo 222wo95r7l5d";
	String regex = "\\d";			//\\d代表的是任意数字
	
	String s2 = s.replaceAll(regex, "");
	System.out.println(s2);
}

代码运行结果:
运行结果

正则表达式的分组功能

  • A:正则表达式的分组功能
    • 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B©)) 中,存在四个这样的组:
    • 1     ((A)(B(C))) 
      2     (A 
      3     (B(C)) 
      4     (C) 
      
      组零始终代表整个表达式。
      
  • B:案例
    • a:切割
      需求:请按照叠词切割: “sdqqfgkkkhjppppkl”;
    • b:替换
      需求:我我…我…我.要…要要…要学…学学…学.编…编编.编.程.程.程…程
      将字符串还原成:“我要学编程”。
  • 代码演示:
/**
	a:切割
		需求:请按照叠词切割: "sdqqfgkkkhjppppkl";
	b:替换
		需求:我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程
		将字符串还原成:“我要学编程”。
 */
/**
 * @author 白白小草
 * @version 1.0
 * @Title: main   
 * @Description: 正则表达式的切割与替换
 */
public static void main(String[] args) {
	
	//需求:请按照叠词切割: "sdqqfgkkkhjppppkl";
	String s = "sdqqfgkkkhjppppkl";
	String regex = "(.)\\1+";					//+代表第一组出现一次到多次
	String[] arr = s.split(regex);
	
	for (int i = 0; i < arr.length; i++) {
		System.out.println(arr[i]);
	}
	
	/*
	 * 需求:我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程
			将字符串还原成:“我要学编程”。
	 */
	String ss = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
	String s2 = ss.replaceAll("\\.+", "");
	String s3 = s2.replaceAll("(.)\\1+", "$1");	//$1代表第一组中的内容
	System.out.println(s3);
}

代码运行结果:
Java 正则表达式 概述及案例_第2张图片

Pattern和Matcher的概述

  • A:Pattern和Matcher的概述

摘自jdk1.8 API_google

Pattern

public final class Pattern
extends Object
implements Serializable
正则表达式的编译表示。
必须首先将正则表达式(指定为字符串)编译为此类的实例。
然后将所得的图案可以被用来创建一个Matcher对象可以匹配任意character sequences针对正则表达式。
执行匹配的所有状态都驻留在匹配器中,所以许多匹配者可以共享相同的模式。

Matcher

public final class Matcher
extends Object
implements MatchResult执行上匹配操作的引擎character sequence通过解释Pattern 。
通过调用模式的matcher方法从模式创建匹配器。 创建后,可以使用匹配器执行三种不同类型的匹配操作:
● matches方法尝试将整个输入序列与模式进行匹配。
● lookingAt方法尝试将起始于输入序列的输入序列与模式进行匹配。
● find方法扫描输入序列,寻找匹配模式的下一个子序列。
这些方法中的每一个返回一个指示成功或失败的布尔值。 通过查询匹配器的状态可以获得有关成功匹配的更多信息。

典型的调用序列
Pattern p = Pattern.compile(“ab");
Matcher m = p.matcher(“aaaaab”);
boolean b = m.matches();
这个类定义了一个matches方法,以便在正则表达式只使用一次时方便。 该方法编译一个表达式,并在单个调用中匹配输入序列。
该声明 boolean b = Pattern.matches("a
b”, “aaaaab”);相当于上面的三个语句,尽管对于重复匹配,它的效率较低,因为它不允许编译的模式被重用。

  • B:模式和匹配器的典型调用顺序
    • 通过JDK提供的API,查看Pattern类的说明

    • 典型的调用顺序是

    • Pattern p = Pattern.compile(“a*b”);

    • Matcher m = p.matcher(“aaaaab”);

    • boolean b = m.matches();

正则表达式的获取功能
  • A:正则表达式的获取功能
    • Pattern和Matcher的结合使用
  • B:案例
    • 需求:把一个字符串中的手机号码获取出来
  • 代码演示:
/** 把一个字符串中的手机号码获取出来 */
/**
 * @author 白白小草
 * @version 1.0
 * @Title: main   
 * @Description: 正则表达式的分组功能
 */
public static void main(String[] args) {
	String s = "我的手机是18988888888,我曾用过18987654321,还用过18812345678";
	String regex = "1[3578]\\d{9}";
	
	Pattern p = Pattern.compile(regex);
	Matcher m = p.matcher(s);
	
	while(m.find())
		System.out.println(m.group());
}

代码运行结果:
运行结果

关于正则表达式,更多的是需要大家去自己着手练习,练习的多了,自然就能更加了解;
如果大家还有什么问题或者好的想法可以在评论区分享出来呀!

你可能感兴趣的:(Java,Java,正则表达式)