当前位置: 首页 > news >正文

Java--正则表达式

一, 定义

正则表达式(regex)是使用字符串来描述、匹配一系列符合某个句法规则的字符串

用途:匹配、切割、替换、获取字符串

正则表达式由一些普通字符和一些元字符组成。

二、元字符

^匹配输入字符串的开始位置

$匹配输入字符串的结束位置

\d匹配一个数字字符。等价于[0-9]

\D匹配一个非数字字符。等价于[^0-9]

\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \n\r\t\f]

\S匹配任何非空白字符。等价于[^\n\r\t\f]

\w匹配包括下划线的任何单个字符。字母数字下划线。等价于"[A-Za-z0-9_]"

\W匹配任何非单个字符。等价于“[^A-Za-z0-9_]”

.  匹配除“\r\n”之外的任何单个字符

{n}n是一个非负整数。匹配确定的n次

{n,}n是一个非负整数。至少匹配n次

{n,m}m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次

*匹配前面的子表达式零次或多次(大于等于0次)

?匹配前面的子表达式零次或一次

+匹配前面的子表达式一次或多次(大于等于1次)

三、难点

在Java中反斜线”\”有三种含义:

1. 反斜线后面可以加特定字符,组成所谓的“转义字符”。eg:  \n    \t  

2. 用于取消元字符的意义,使元字符变为普通字符。eg:  “\\” 代表”\”。

3. 用于组成正则表达式中的元字符。

 eg:  “\d” 在正则表达式中代表“匹配一个数字字符”。

package regex;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EmailRegex {

	public static void main(String[] args) {
		String emailRegex="\\w+@\\w+\\.\\w+\\.?\\w+";		
        Scanner scan=new Scanner(System.in);
        System.out.print("请输入邮箱:");
        String email=scan.next();
        Pattern pat=Pattern.compile(emailRegex);  // 将正则表达式封装到Pattern对象中
		Matcher mat=pat.matcher(email);   // 创建一个匹配器Matcher,该Matcher对象可以根据正则表达式判断传入的字符串是否符合要求
		if(mat.matches()){
			System.out.println("恭喜,邮箱格式正确!");
		}else{
			System.out.println("对不起,邮箱格式不正确!");
		}
	}
}

运行结果:

四、Pattern类与Matcher类

     1. Pattern类与Matcher类都在java.util.regex包中定义。

     2. Pattern类的对象代表正则表达式编译之后的对象;Matcher类主要用于执行验证。

     3.Pattern类的主要方法:

        public static Pattern compile(String regex);

        public Matcher matcher(CharSequence input)

       Matcher类的主要方法:

        public boolean matches();

        find());

        group(0); //0是匹配整个正则表达式,1是第一个分组里的

package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatch {
	public static void main(String[] args) {
		String birthday="1994-02-25";
		String regex="\\d{4}-\\d{2}-\\d{2}";
		Pattern pat=Pattern.compile(regex);  // 将正则表达式封装到Pattern对象中
		Matcher mat=pat.matcher(birthday);   // 创建一个匹配器Matcher,该Matcher对象可以根据正则表达式判断传入的字符串是否符合要求
		if(mat.matches()){
			System.out.println("匹配成功!");
		}else{
			System.out.println("匹配失败...");
		}
	}
}
public class GroupRegex {
	public static void main(String[] args) {
		String str="abchello123regexhello56789javascriptsajdfisjfaslfhello999slakjfldsf";
		String regex="\\w+(hello\\d+)\\w+(hello\\d+)";
		Pattern pat=Pattern.compile(regex);
		Matcher mat=pat.matcher(str);
		System.out.println(mat.find());
		System.out.println(mat.group(0));  //0是整个串,1是第一个括号里的
		System.out.println(mat.group(1));
		System.out.println(mat.group(2));
	}

运行结果:

五、String类对正则表达式的支持

1.  public boolean matches(String regex)               判断字符串是否与给定的正则表达式匹配。

2.  public String replaceAll(String regex,String replacement)字符串替换

3.  public String[] split(String regex)                       字符串拆分 

package regex;
public class StringRegex {
	public static void main(String[] args) {
		String str="hello1java22regex333python4444C55555";
		if(str.matches("\\w+")){
			System.out.println("匹配成功!");
		}
		System.out.println("替换后的字符串为:"+str.replaceAll("\\d+","#"));
		
		String country="中国|美国|俄罗斯|德国";
		String[] array=country.split("\\|");
		for(String c:array){
			System.out.print(c+"  ");
		}
	}
}

运行结果:

注意:正则表达式中的问号?有两种作用:

 第一种作用:重复前面表达式0次或1次。

 第二种作用:在表示次数的元字符后加上?代表取消默认的贪婪匹配模式,变为“非贪婪匹配模式”

String str="abbbbbbb";
		System.out.println("贪婪模式匹配: "+str.replaceAll("ab+","#"));    // "#"
		System.out.println("非贪婪模式匹配: "+str.replaceAll("ab+?","#")); //”#bbbbbb”

相关文章:

  • java计算机毕业设计家政服务管理源码+数据库+系统+lw文档+mybatis+运行部署
  • Java常量池理解
  • Dubbo入门介绍及学习笔记总结
  • 【SpringMVC】重定向和转向详解
  • ocr的场景应用--发票识别
  • Dubbo入门(四)Provider和Consumer的注解实现
  • dubbo分布式日志调用链追踪
  • 软件测试周刊(第87期):天下就没有偶然,那不过是化了妆的、戴了面具的必然。
  • 灵性图书馆:好书推荐-《把好运吸过来》
  • 关于Springboot的@Profile的写法以及多个profile的写法排坑(“!profile1 !profile2“ 的写法)
  • Dubbo 原理与部署
  • 文章概述美国APX511B音频分析仪
  • linux shell脚本基础语法(变量篇)
  • dubbo Can not lock the registry cache file
  • dubbo 自定义异常
  • css布局,左右固定中间自适应实现
  • django开发-定时任务的使用
  • ECMAScript6(0):ES6简明参考手册
  • HTTP中的ETag在移动客户端的应用
  • js递归,无限分级树形折叠菜单
  • maya建模与骨骼动画快速实现人工鱼
  • Python - 闭包Closure
  • Sass Day-01
  • Selenium实战教程系列(二)---元素定位
  • Swift 中的尾递归和蹦床
  • Vue2 SSR 的优化之旅
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 技术发展面试
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开发基于以太坊智能合约的DApp
  • 深度学习中的信息论知识详解
  • 学习JavaScript数据结构与算法 — 树
  • 关于Android全面屏虚拟导航栏的适配总结
  • # centos7下FFmpeg环境部署记录
  • ###C语言程序设计-----C语言学习(3)#
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (12)Hive调优——count distinct去重优化
  • (C)一些题4
  • (三)终结任务
  • (转)EXC_BREAKPOINT僵尸错误
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET成年了,然后呢?
  • .NET的微型Web框架 Nancy
  • @Transactional 详解
  • @vue/cli 3.x+引入jQuery
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [AIGC] Spring Interceptor 拦截器详解
  • [Android Pro] AndroidX重构和映射
  • [android] 看博客学习hashCode()和equals()
  • [Android学习笔记]ScrollView的使用
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)